number - time en mysql workbench
MySQL siempre devuelve los valores BIT como en blanco (4)
Desde mi script crear tabla, he definido el campo hasMultipleColors como BIT:
hasMultipleColors BIT NOT NULL,
Cuando se ejecuta un INSERT, no se emiten advertencias para este u otros campos BIT, pero la selección de las filas muestra que todos los valores BIT están en blanco.
Tratar manualmente de ACTUALIZAR estos registros desde la línea de comando da un efecto extraño: muestra que el registro fue coincidente y se modificó (si corresponde), pero igual se muestra en blanco.
Versión del servidor: 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)
¿Alguna idea?
La razón real del efecto que ve es que se hace bien y como se espera.
El campo de bits tiene bits y, por lo tanto, devuelve bits, e intentar generar un solo bit como carácter mostrará el carácter con el valor de bit dado, en este caso un carácter de control de ancho cero.
Algún software puede manejar esto automágicamente, pero para la línea de comando MySQL tendrá que convertirlo en int de alguna manera (por ejemplo, agregando cero).
En idiomas como PHP, el valor ordinal del personaje le dará el valor correcto, utilizando la función ord()
(aunque para ser realmente correcto, debería ser convertido de cadena decimal a binaria, para trabajar en campos de bit más largos que uno) personaje).
EDITAR:
Encontré una fuente bastante antigua que decía que había cambiado, por lo que una actualización de MySQL podría hacer que todo funcione más como se esperaba: http://gphemsley.wordpress.com/2010/02/08/php-mysql-and-the-bit-field-type/
Necesita convertir el campo de bit a un entero.
mysql> select hasMultipleColors+0 from pumps where id = 1;
Esto se debe a un error, mira: http://bugs.mysql.com/bug.php?id=43670 . El estado dice: No arreglará.
Necesita realizar una conversión ya que el bit 1
no es imprimible.
SELECT hasMultipleColors+0 from pumps where id = 1;
Vea más aquí: http://dev.mysql.com/doc/refman/5.0/en/bit-field-literals.html
Puede lanzar el campo BIT a unsigned.
SELECT CAST(hasMultipleColors AS UNSIGNED) AS hasMultipleColors from pumps where id = 1
hasMultipleColors
1 o 0 según el valor de hasMultipleColors
.