在MySQL中存储二进制字符串
我已经为我们的管理中心开发了一个小型的二进制标志系统。它允许我们将项目设置为具有分配给它们的多个选项,而不必存储包含多个字段的表在MySQL中存储二进制字符串,mysql,binary,bit-manipulation,options,flags,Mysql,Binary,Bit Manipulation,Options,Flags,我已经为我们的管理中心开发了一个小型的二进制标志系统。它允许我们将项目设置为具有分配给它们的多个选项,而不必存储包含多个字段的表 一旦使用位运算符将选项转换为二进制,我们将得到一个像10000或10010这样的选项,这都很好。通过这种方式,我们可以不断添加选项,但不必重新写入哪个值是哪个,10010&(1在这里有用吗?要检查是否设置了位,您的查询需要: SELECT * FROM _table_ x WHERE x.options & (1 << 4) != 0 一点“建设
一旦使用位运算符将选项转换为二进制,我们将得到一个像10000或10010这样的选项,这都很好。通过这种方式,我们可以不断添加选项,但不必重新写入哪个值是哪个,10010&(1在这里有用吗?要检查是否设置了位,您的查询需要:
SELECT * FROM _table_ x WHERE x.options & (1 << 4) != 0
一点“建设性”的批评:您是否想过创建一个带有选项名的表并将其链接到用户?(我假设您每个用户都有选项,而不是安装)。例如,选项表有两列[user\u id,option\u name]。在Java中,您可以将选项名映射到枚举(我确信其他语言也有类似的结构)。这种方法的好处是,你可以阅读选项,而不是做一些困难的计算。特别是如果应用程序增加到20或30个选项。不会这样工作。抱歉。这不是用户->选项。看起来是部分,但由于添加了大量新选项/标志,这将不是一个可行的解决方案。使用INT/BIGINT键入你最多可存储32/64个选项/标志,同样适用于SET数据类型。使用带数字的命名标志更方便。实际上,我指的是
INT
字段类型。早在BIT
实际上是位字段类型之前(在5.0.3之前,它是TINYINT
的别名)我就使用过它了。我实际上还没有尝试过较新的BIT
字段,因此我不确定它是否使用了相同的方式。BIT
字段似乎不允许我存储多个选项。因此我很高兴继续使用INT
字段类型。使用INT
我无法存储任何以前导0开头的内容(显然).保留一个数字但允许0的想法?嗯,我不确定我是否明白你的意思?我更新了答案,告诉你如何在INT
中设置位。哦,我明白了,我忘了b
运算符
SELECT * FROM _table_ x WHERE x.options & (1 << 4) != 0
SELECT * FROM _table_ x WHERE x.options & (1 << 4) = 0
UPDATE table SET options = options | (1 << 4)
UPDATE table SET options = options &~ (1 << 4)
UPDATE table SET options = b'00010010'