【问题标题】:MySQL always returning BIT values as blankMySQL 总是将 BIT 值返回为空白
【发布时间】:2012-07-21 12:12:05
【问题描述】:

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

有什么想法吗?

【问题讨论】:

  • 你为什么不使用BOOL 而不是BIT 呢?从您的字段名称的语义来看,它会更有意义。
  • 阅读了一些关于 BOOL、BIT 和 TINYINT 数据类型的资料,我得出的结论是 MySQL 以非常糟糕的方式处理 BOOL - 不能移植到其他 RDBMS 解决方案 - 所以与 TINYINT 或 BIT 一起使用通常是理想的(更高效)。

标签: mysql sqldatatypes


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    SELECT hasMultipleColors+0 from pumps where id = 1;

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

    【讨论】:

      【解决方案3】:

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

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

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

      在像 PHP 这样的语言中,字符的序数值会给你正确的值,使用 ord() 函数(虽然要真正正确,它必须从十进制转换为二进制字符串,才能用于位字段超过一个字符)。

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

      【讨论】:

        【解决方案4】:

        您需要将位域转换为整数。

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

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

        【讨论】:

        • 知道了,谢谢。所以这只是一个显示问题,而不是正确捕获和存储数据。在选择中使用 * 时有什么方法可以自动转换位数据类型?
        • 我有一个非常奇怪的版本,在第一种情况下,BIT 字段显示没有问题。但是然后在另一个表中,其中 BIT 字段的定义就像在第一个表中一样,除非我执行诸如在每个 BIT 列中添加 0 之类的操作,否则不会打印任何内容。如果这是一个错误,那么为什么它只在第一种情况下工作而不是第二种情况? TL:DR 给出血淋淋的细节。另一个奇怪的地方:虽然这个问题发生在我服务器上的 mysql 客户端中,但我的 IDE (PHPStorm) 中内置的客户端根本没有问题,只适用于 BIT 字段。
        • @RTB 这个问题有一个简单的解决方案,我加了。
        猜你喜欢
        • 2014-06-24
        • 1970-01-01
        • 1970-01-01
        • 2021-11-20
        • 1970-01-01
        • 2016-07-11
        • 1970-01-01
        • 1970-01-01
        • 2019-12-05
        相关资源
        最近更新 更多