【问题标题】:Why MySQL query does not properly insert BIT(50) bitfield为什么 MySQL 查询没有正确插入 BIT(50) 位域
【发布时间】:2013-04-22 18:58:58
【问题描述】:

我正在我当前项目的数据库中实现一个位域列。它有 50 位长,但似乎没有正确插入我在 PHP 中创建的位域。这是文字查询(我尝试在 PHP 和 phpMyAdmin 中都提交它)。

 INSERT INTO features (title, category_id, bitnum) 
 VALUES ("a6", "0", b'00000000000000000000000000100000000000000000000000')

但是 phpMyAdmin 和 PHP 出于某种原因输出的值是这样的:

00001100110011100000111000001101100011000000111000

现在,如果我选择在 SELECT 查询中使用 BIN(bitnum) 选择 bitnum 列,它会输出正确的值。但在我继续之前,我需要知道我是否真的做对了(因为我需要稍后检查该列是否有标志)。我插入的第一个位域(中间只有一个 1)似乎不正确,变成了 0 和 1 的奇怪混乱,现在对我来说没有任何意义。

我无法在 Google 上找到任何关于此主题的内容,也无法找到。 据我了解,BIT 列最多支持 64 位。

提前致谢。

【问题讨论】:

    标签: mysql bit bit-fields


    【解决方案1】:

    您的bitnum 列是否定义为bit(50)

    我的猜测是该值已正确插入数据库。之后的一切都需要进行一些测试。

    当你说“phpMyAdmin 和 PHP 出于某种原因输出是这样的:00001100110011100000111000001101100011000000111000”时,你是否使用了一些查询?

    我尝试使用 PhpMyAdmin,但它显示 bit 列为空,NULL 或其他。即使使用 PhpMyAdmin 的 SQL 查询界面也没有显示它们应该出现的值。尝试一些其他的数据库管理软件。我使用Sequel Pro,它会在bit 值输入数据库时​​显示它们。 (也许 PhpMyAdmin 也是这样做的,我只是不知道怎么做。)

    至于 PHP 引擎,嗯...见my interesting question。某些 PHP 版本中可能存在错误。至少与此类似的查询应该检索到正确的值。

    SELECT (bitnum + 0) AS my_multiple_bit FROM features
    

    这是那个问题的my RTM momentIf "+ 0" is not used the value of a bit(1) column is treated as binary string.(还请记住,PHP 版本可能会导致它自己的问题。)

    也许BIN(bitnum) 也可以用作(bitnum + 0)。尝试使用另外一个 PHP 引擎版本进行测试。如果一切正常,那么……那么一切正常。

    顺便说一句。使用bit(50) 列是否有某些特定原因? intchar 有什么问题? (我使用bit(1) 作为布尔值true/false 只是为了好玩。tinyint(1) 是我的另一种布尔值。我没有读过this whole article 但也许bit 列不是MySQL 中列类型的最佳选择。)

    【讨论】:

    • 我决定放弃位解决方案并按照您的建议使用 int(实际上是 bigint)。我将您的答案设置为正确,因为我在其他地方读到添加“+0”将强制 MySQL 正确处理它。此外,您分享的文章似乎很有价值 - BIT 显然不是最佳选择。并且按位 AND 在数值上也同样有效,我只是没想到这一点 - 但它非常有意义:) 感谢您的宝贵时间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-23
    • 2021-03-24
    • 1970-01-01
    • 2018-07-06
    • 2016-08-21
    • 1970-01-01
    相关资源
    最近更新 更多