Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在MySQL中存储二进制字符串_Mysql_Binary_Bit Manipulation_Options_Flags - Fatal编程技术网

在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'