Подтвердить что ты не робот

MySQL всегда возвращает значения BIT как пустые

Из моей таблицы create script я определил поле hasMultipleColors как BIT:

hasMultipleColors BIT NOT NULL,

При запуске INSERT для этого или других полей BIT не отображаются предупреждения, но выбор строк показывает, что все значения BIT пустые.

В ручном режиме UPDATE эти записи из командной строки дают нечетный эффект - показывает, что запись была сопоставлена ​​и изменена (при необходимости), но все равно всегда отображается пустым.

Версия сервера: 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)

Любые мысли?

4b9b3361

Ответ 1

Вам нужно указать поле бит в целое число.

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

Это из-за ошибки, см.: http://bugs.mysql.com/bug.php?id=43670. Статус говорит: не исправит.

Ответ 2

Вам необходимо выполнить преобразование, поскольку bit 1 не может быть распечатано.

SELECT hasMultipleColors+0 from pumps where id = 1;

Подробнее здесь: http://dev.mysql.com/doc/refman/5.0/en/bit-field-literals.html

Ответ 3

Вы можете отличить поле BIT от unsigned.

  SELECT CAST(hasMultipleColors AS UNSIGNED) AS hasMultipleColors from pumps where id = 1

Он вернет 1 или 0 на основе значения hasMultipleColors.

Ответ 4

Фактическая причина эффекта, который вы видите, заключается в том, что он сделан правильно и как ожидалось.

Поле bit имеет биты и, таким образом, возвращает биты и пытается вывести один бит в качестве символа, будет отображать символ с заданным битовым значением - в этом случае символ управления нулевой шириной.

Некоторое программное обеспечение может обрабатывать это автоматически, но для командной строки MySQL вам нужно каким-то образом передать его как int (например, добавив нуль).

В таких языках, как PHP, порядковое значение символа даст вам правильное значение, используя функцию ord() (хотя, чтобы быть действительно правильной, ее пришлось бы преобразовать из десятичной в двоичную строку, чтобы работать для битных полей длиннее одного символа).

EDIT:
Найден довольно старый источник, говорящий, что он изменился, поэтому обновление MySQL может заставить все работать как можно скорее: http://gphemsley.wordpress.com/2010/02/08/php-mysql-and-the-bit-field-type/