Maison > base de données > tutoriel mysql > le corps du texte

Pourquoi l'insertion de 0 dans un champ MySQL BIT(1) donne-t-elle 1 ?

Patricia Arquette
Libérer: 2024-11-03 05:42:02
original
842 Les gens l'ont consulté

Why Does Inserting 0 into a MySQL BIT(1) Field Result in 1?

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 :

  • Les colonnes BIT sont alignées en octets, consommant un octet complet pour chaque ligne, quelle que soit la taille spécifiée.
  • PDO interprète incorrectement le 0 valeur comme bit 1 en raison de problèmes d'alignement des octets.

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)) ;
Copier après la connexion

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();
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal