在mysql中存储和匹配二进制数据

时间:2010-02-24 12:04:52

标签: mysql

我正在尝试在db中存储不同的多个选择字段状态。 因此,一个选择列表将是:

<option value="1">a1</option>
<option value="2">a2</option>
<option value="4">a3</option>
<option value="8">a4</option>

我想在没有第二个(规范化的)表的情况下尝试这个。所以我想出了添加选项值并将其保存在数据库中。这样我就可以读出它们,转换它们并搜索2个值的幂。

在db中搜索时出现问题。说有人搜索a1。那将是1,但也是3,因为它是a1和a2的组合。

所以这有点令人困惑。现在我试图存储二进制值,如101,并对其加工十进制值。当搜索a1或a2时,我必须搜索(二进制)1和11.我不知道如何匹配这个,我很害羞有一个更好的方法,对吧?

1 个答案:

答案 0 :(得分:1)

你正在使用所谓的bit-field;这意味着您必须使用按位运算符/函数来处理数据。

请参阅11.11.1. Bit Functions

例如,要选择设置为“1”位的行,您必须使用以下内容:

select *
from your_table
where (your_field & 1) = 1

要测试thirg位(即对应于值4的那个,即1<<2,您将使用:

select *
from your_table
where (your_field & 1<<2) = 1


作为旁注:当使用这种计算时,MySQL必须进行全扫描(即遍历表中的每一行)以找到符合条件的那些......这可能不是如果你有很多台词,那就非常适合表演。


而且,作为一个快速演示:

mysql> select (4 & 1<<2);
+------------+
| (4 & 1<<2) |
+------------+
|          4 |
+------------+

mysql> select (3 & 1<<2);
+------------+
| (3 & 1<<2) |
+------------+
|          0 |
+------------+