从我的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)
有什么想法吗?
答案 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/