MySQL总是将BIT值返回为空白

问题描述 投票:33回答:4

从我的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)

有什么想法吗?

mysql sqldatatypes
4个回答
51
投票

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

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

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


6
投票

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

SELECT hasMultipleColors+0 from pumps where id = 1;

在这里查看更多:http://dev.mysql.com/doc/refman/5.0/en/bit-field-literals.html


6
投票

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

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

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


0
投票

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

bit字段具有位,因此返回位,并且尝试输出单个位作为字符将显示具有给定位值的字符 - 在这种情况下是零宽度控制字符。

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

在PHP这样的语言中,字符的序数值将使用ord()函数为您提供正确的值(尽管非常合适,但必须将其从十进制转换为二进制字符串,以适用于长于一个字符的位字段) 。

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

© www.soinside.com 2019 - 2024. All rights reserved.