在MySQL中存储二进制字符串

Jam*_*mes 6 mysql binary flags bit-manipulation options

我为我们的管理中心开发了一个小型二进制标志系统.它允许我们设置项目以分配多个选项,而不必存储具有多个字段的表.

一旦使用按位运算符将选项转换为二进制,我们最终会得到10000或10010之类的选项,这一切都很好.这样做可以让我们继续添加选项,但不必重写哪个值,10010&(1 << 4),我知道我们已经开启了一些东西.

但问题是将这些数据存储在我们的MySQL表中.我已经尝试了几种字段类型,但它们都没有允许我执行查询,例如

SELECT * FROM _table_ x WHERE x.options & (1 << 4)
Run Code Online (Sandbox Code Playgroud)

建议?

Whi*_*g34 3

要检查是否设置了位,您的查询需要是:

SELECT * FROM _table_ x WHERE x.options & (1 << 4) != 0
Run Code Online (Sandbox Code Playgroud)

并检查它是否未设置:

SELECT * FROM _table_ x WHERE x.options & (1 << 4) = 0
Run Code Online (Sandbox Code Playgroud)

更新:以下是设置单个位的方法:

UPDATE table SET options = options | (1 << 4)
Run Code Online (Sandbox Code Playgroud)

要清除单个位:

UPDATE table SET options = options &~ (1 << 4)
Run Code Online (Sandbox Code Playgroud)

您还可以使用二进制字符串一次性设置它们:

UPDATE table SET options = b'00010010'
Run Code Online (Sandbox Code Playgroud)