L'insertion de 0 dans un champ MySQL BIT(1) donne 1 : problème et solution
Une tentative d'insertion d'une valeur 0 dans un Le champ BIT(1) dans MySQL utilisant des instructions préparées par PDO entraîne de manière inattendue l'écriture d'une valeur de 1 dans la table. Ce comportement se produit malgré l'utilisation de diverses formes de liaison de paramètres et même de SQL brut, mais uniquement lors de l'insertion de la valeur 0.
Pourquoi les espaces réservés échouent pour l'insertion 0
La colonne BIT dans MySQL est un type binaire, ce qui peut entraîner des problèmes de compatibilité avec les bibliothèques clientes comme PDO. Le problème se pose pour les raisons suivantes :
Solution : utilisez plutôt TINYINT(1)
Pour résoudre ce problème, il est recommandé de modifier le type de colonne de BIT(1) à TINYINT(1). Cela garantira qu'un seul octet est alloué pour chaque ligne, quelle que soit la valeur insérée. TINYINT(1) peut également être utilisé pour stocker des valeurs booléennes, éliminant ainsi les problèmes de compatibilité avec les colonnes BIT.
Par exemple, le code suivant devrait fonctionner correctement :
$pdo = new PDO("connection string etc") ; $statement = $pdo->prepare('INSERT INTO `test` (SomeText,TestBool) VALUES (?,?)') ; $statement->execute(array("TEST",0)) ;
Si vous souhaitez toujours pour utiliser BIT(1), vous pouvez essayer la solution de contournement suivante :
$statement = $pdo->prepare('INSERT INTO `test` (SomeText,TestBool) VALUES (:someText,:testBool)') ; $statement->bindValue(':someText', "TEST"); $statement->bindValue(':testBool', 0, PDO::PARAM_INT); $statement->execute();
Cependant, passer à TINYINT(1) est la solution préférée car elle offre un comportement cohérent entre différents types de données et garantit la compatibilité avec divers clients. bibliothèques.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!