2010-02-24 137 views
1

我試圖在數據庫中存儲不同的多個選擇字段狀態。 所以,一個選擇列表是:在mysql中存儲和匹配二進制數據

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

我想試試這個沒有第二個(歸)表。所以我想出了添加選項值並將它們保存在數據庫中。這樣我可以將它們讀出來,轉換它們並搜索2值的權力。

問題是在數據庫中搜索時。說別人搜索a1。這將是1,但也是3,因爲它是a1和a2的組合。

所以這是一種混亂。現在即時嘗試存儲值的二進制,如101和加工十進制值反對它。當搜索a1或a2我必須搜索(二進制)1和11.我不知道如何匹配這個,我很確定有更好的方法來解決這個問題,對吧?

+0

這實際上是不是二進制數據(斑點,文件,圖像),但數字的二進制表示(7 = 111 )... – knittl 2010-02-24 12:14:26

+0

我的英語不是很好。我只是把它稱爲二進制數據,但它顯然不是一個blob ... – Mike 2011-04-20 21:44:25

回答

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 | 
+------------+ 
+0

這就是它是一個位場(這裏沒有斑點)。不知道英文單詞。 我現在試過這個: AND(field&3)!= 0 這樣我就可以找到所有匹配,包括1或2,這很棒。 每次觸發全掃描的事實並不是那麼好...... – Mike 2010-02-24 12:39:04