web-dev-qa-db-fra.com

MySQL renvoie toujours les valeurs BIT vierges

À partir de mon script de création de table, j'ai défini le champ hasMultipleColors en tant que BIT:

hasMultipleColors BIT NOT NULL,

Lors de l'exécution d'un INSERT, aucun avertissement n'est émis pour ce champ ni pour les autres champs BIT, mais la sélection des lignes indique que toutes les valeurs BIT sont vides.

Essayer manuellement de mettre à jour ces enregistrements à partir de la ligne de commande produit un effet impair: indique que l'enregistrement était identique et modifié (le cas échéant), mais reste toujours vide.

Version du serveur: 5.5.24-0ubuntu0.12.04.1 (Ubuntu)

mysql> update pumps set hasMultipleColors = 1 where id = 1;
Query OK, 0 rows affected (0.00 sec)
Rows matched: 1  Changed: 0  Warnings: 0

mysql> select hasMultipleColors from pumps where id = 1;
+-------------------+
| hasMultipleColors |
+-------------------+
|                  |
+-------------------+
1 row in set (0.00 sec)

mysql> update pumps set hasMultipleColors = b'0' where id = 1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select hasMultipleColors from pumps where id = 1;
+-------------------+
| hasMultipleColors |
+-------------------+
|                   |
+-------------------+
1 row in set (0.00 sec)

Des pensées?

32
CdrXndr

Vous devez convertir le champ de bits en entier.

mysql> select hasMultipleColors+0 from pumps where id = 1;

Ceci est dû à un bogue, voir: http://bugs.mysql.com/bug.php?id=43670 . Le statut dit: ne réparera pas. 

50
RTB

Vous devez effectuer une conversion car bit 1 n'est pas imprimable.

SELECT hasMultipleColors+0 from pumps where id = 1;

Voir plus ici: http://dev.mysql.com/doc/refman/5.0/en/bit-field-literals.html

6
mihaisimi

Vous pouvez convertir le champ BIT en non signé.

  SELECT CAST(hasMultipleColors AS UNSIGNED) AS hasMultipleColors 
  FROM pumps 
  WHERE id = 1

Il retournera 1 ou 0 en fonction de la valeur de hasMultipleColors.

5
A J

La raison réelle de l'effet que vous voyez est que c'est fait correctement et comme prévu.

Le champ bit contient des bits et renvoie donc des bits. Si vous tentez de générer un seul bit sous la forme d'un caractère, celui-ci affiche le caractère avec la valeur de bit donnée - dans ce cas, un caractère de contrôle de largeur nulle.

Certains logiciels peuvent gérer cela automatiquement, mais pour MySQL en ligne de commande, vous devrez le transtyper comme int d’une manière ou d’une autre (par exemple, en ajoutant zéro).

Dans des langages comme PHP, la valeur ordinale du caractère vous donnera la bonne valeur, à l'aide de la fonction ord() (bien que ce soit vraiment correct, il devrait être converti de chaîne décimale en chaîne binaire, pour fonctionner avec les bits). champs plus longs qu'un caractère).

EDIT:
Une source assez ancienne a déclaré qu'elle avait changé. Une mise à niveau de MySQL pourrait donc tout faire fonctionner normalement: http://gphemsley.wordpress.com/2010/02/08/php-mysql-and -the-bit-field-type/

0
Flygenring