2012-07-23 73 views
30

从我创建表的脚本,我已经定义了hasMultipleColors字段作为BIT:的MySQL总是返回位值作为空白

hasMultipleColors BIT NOT NULL, 

当运行一个INSERT,没有抛出这个或警告的其他BIT字段,但选择行显示所有BIT值都是空白的。

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

Server版本: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'?从你的字段名称的语义,它会更有意义。 – Romain 2012-07-23 09:11:48

+2

对BOOL与BIT与TINYINT数据类型有一些了解,而我采取的外带手段是MySQL以非常差的方式处理BOOL - 不能移植到其他RDBMS解决方案 - 所以它通常适用于TINYINT或BIT(更高效)。 – CdrXndr 2012-07-24 04:33:45

回答

44

您需要的位字段强制转换为整数。

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

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

+1

明白了,谢谢。所以这只是一个显示问题,而不是正确捕获和存储数据。在select中使用*时自动强制转换位数据类型的方法? – CdrXndr 2012-07-23 16:40:45

+1

我有一个非常奇怪的版本,在第一种情况下,BIT字段显示没有问题。但是,在不同的表格中,BIT字段的定义与第一个表格中的定义相同,除非我在每个BIT列中添加0,否则不会打印任何内容。如果这是一个错误,那么为什么它只是在第一种情况下工作,而不是在第二种情况下工作? TL:DR给予血淋淋的细节。另外一个奇怪的现象:当我的服务器上的mysql客户端出现这个问题时,内置于我的IDE(PHPStorm)中的客户端根本没有问题,只能用于BIT字段。 – 2013-10-17 17:06:41

+0

@RTB这个问题有一个简单的解决方案,我添加了它。 – 2016-05-18 07:29:34

0

您看到的效果的实际原因是它的操作是正确的,并且和预期的一样。

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

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

在像PHP这样的语言中,字符的序数值会给你正确的值,使用ord()函数(尽管真的很合适,它必须从十进制转换为二进制字符串,以便为位域比一个字符)。

编辑:
发现了一个很旧的源说,它改变,所以一个MySQL升级可能使一切工作更预期:http://gphemsley.wordpress.com/2010/02/08/php-mysql-and-the-bit-field-type/

2

你可以施放位字段为无符号。

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

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