MySQL siempre devuelve valores de BITS en blanco


Desde mi script crear tabla, he definido el campo hasMultipleColors como un BIT:

hasMultipleColors BIT NOT NULL,

Al ejecutar un INSERTO, no se lanzan advertencias para este u otros campos de BITS, pero al seleccionar las filas se muestra que todos los valores de BITS están en blanco.

Intentar actualizar manualmente estos registros desde la línea de comandos da un efecto impar: muestra que el registro coincidió y cambió (si es apropiado), pero siempre 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)

¿Algún pensamiento?

Author: CdrXndr, 2012-07-23

4 answers

Necesita convertir el campo de bits a un entero.

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

Esto se debe a un error, ver: http://bugs.mysql.com/bug.php?id=43670 . El estado dice: No se arreglará.

 47
Author: RTB,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-23 09:17:21

Necesita realizar una conversión ya que bit 1 no se puede imprimir.

SELECT hasMultipleColors+0 from pumps where id = 1;

Ver más aquí: http://dev.mysql.com/doc/refman/5.0/en/bit-field-literals.html

 6
Author: mihaisimi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-11 06:55:18

Puede convertir el campo de BITS a unsigned.

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

Devolverá 1 o 0 basado en el valor de hasMultipleColors.

 4
Author: A J,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-18 04:20:06

La razón real del efecto que ves, es que se hace bien y como se esperaba.

El campo bit tiene bits y, por lo tanto, devuelve bits, e intentar generar un solo bit como un 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 automagically, pero para la línea de comandos MySQL tendrá que convertirlo como int de alguna manera (por ejemplo, añadiendo cero).

En lenguajes como PHP el valor ordinal de la character le dará el valor correcto, usando la función ord() (aunque para ser realmente adecuada, tendría que ser convertida de cadena decimal a binaria, para trabajar con campos de bits más largos que un carácter).

EDITAR:
Encontré una fuente bastante antigua diciendo que cambió, 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 /

 0
Author: Flygenring,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-07 06:22:17