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)

有什么想法吗?

4

4 回答 4

64

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

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

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

于 2012-07-23T09:17:21.227 回答
8

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

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

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

于 2015-12-11T06:23:27.850 回答
6

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

SELECT hasMultipleColors+0 from pumps where id = 1;

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

于 2012-07-23T09:11:52.020 回答
0

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

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

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

在像 PHP 这样的语言中,字符的序数值将使用该ord()函数为您提供正确的值(尽管要真正正确,它必须从十进制转换为二进制字符串,才能用于长度超过一个字符的位字段)。

编辑:
发现一个很老的消息来源说它发生了变化,因此 MySQL 升级可能会使一切按预期工作:http: //gphemsley.wordpress.com/2010/02/08/php-mysql-and-the-bit-字段类型/

于 2014-10-07T06:16:34.280 回答