MySQL总是返回空白的BIT值

42

从我的创建表脚本中,我将 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)

有什么想法吗?


1
为什么你不用BOOL而是用BIT呢?从你字段名称的语义来看,使用BOOL更合理。 - Romain
3
我阅读了一些关于BOOL vs. BIT vs. TINYINT数据类型的内容,我的理解是MySQL处理BOOL的方式非常糟糕 - 无法移植到其他RDBMS解决方案 - 因此通常最好选择TINYINT或BIT(更有效率)。 - CdrXndr
4个回答

66
你需要将位域转换为整数。
mysql> select hasMultipleColors+0 from pumps where id = 1;

这是因为一个bug,详情见:http://bugs.mysql.com/bug.php?id=43670。状态显示:不会修复。


1
明白了,谢谢。所以这只是一个显示问题,而不是数据被正确捕获和存储的问题。在使用*选择时是否有自动转换位数据类型的方法? - CdrXndr
1
我有一个非常奇怪的版本,第一种情况下BIT字段显示没有问题。但是在另一个表中,BIT字段的定义与第一个表完全相同,除非我对每个BIT列添加0之类的操作,否则什么也不打印。如果这是一个错误,那么为什么它只在第一种情况下工作而不在第二种情况下?简而言之,还有另一个奇怪之处:虽然在我的服务器上的mysql客户端中出现了此问题,但内置于我的IDE(PHPStorm)的客户端根本没有问题,并且可以使用BIT字段正常工作。 - Jeffrey Simon
@RTB 这个问题有一个简单的解决方案,我已经添加了它。 - A J

8

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

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

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


6

0

你看到的效果实际上是按照预期正确执行了。

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

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

在像 PHP 这样的语言中,字符的序数值将为您提供正确的值,使用 ord() 函数(虽然为了真正正确,它必须从十进制转换为二进制字符串,以适用于比一个字符更长的位字段)。

编辑:
发现一个相当古老的来源说它已经改变了,因此 MySQL 升级可能会使所有内容都按预期工作:http://gphemsley.wordpress.com/2010/02/08/php-mysql-and-the-bit-field-type/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接