MySQL总是将BIT值返回为空白

时间:2012-07-23 09:08:41

标签: mysql sqldatatypes

从我的create table脚本中,我已将hasMultipleColors字段定义为BIT:

hasMultipleColors BIT NOT NULL,

运行INSERT时,没有为此或其他BIT字段抛出警告,但选择行显示所有BIT值都为空。

手动尝试从命令行更新这些记录会产生奇怪的效果 - 显示记录匹配并更改(如果适用),但仍然始终显示为空白。

服务器版本: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)

有什么想法吗?

4 个答案:

答案 0 :(得分:50)

您需要将位字段转换为整数。

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

这是因为一个错误,请参阅:http://bugs.mysql.com/bug.php?id=43670。状态说:不会修复。

答案 1 :(得分:6)

您需要执行转换,因为bit 1不可打印。

SELECT hasMultipleColors+0 from pumps where id = 1;

在此处查看更多信息: http://dev.mysql.com/doc/refman/5.0/en/bit-field-literals.html

答案 2 :(得分:6)

您可以将BIT字段转换为无符号。

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

它将根据hasMultipleColors的值返回1或0。

答案 3 :(得分:0)

您看到的效果的实际原因是,它是按照预期正确完成的。

bit字段有位,因此返回位,并尝试输出单个位作为字符将显示具有给定位值的字符 - 在本例中为零宽度控制字符。

某些软件可能会自动处理此问题,但对于命令行MySQL,您必须以某种方式将其转换为int(例如,通过添加零)。

在像PHP这样的语言中,字符的序数值将使用ord()函数为您提供正确的值(虽然要非常合适,但必须将其从十进制转换为二进制字符串,才能工作比特字段超过一个字符)。

修改
找到一个相当古老的消息来源说它发生了变化,因此MySQL升级可能会使一切工作更加符合预期:http://gphemsley.wordpress.com/2010/02/08/php-mysql-and-the-bit-field-type/