2010-02-24 2 views
1

Я пытаюсь сохранить различные состояния поля select select в db. Так один список выбора будет:Хранение и сопоставление двоичных данных в mysql

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

Я хочу попробовать это без второго (нормированной) таблицы. Поэтому я придумал добавить значения параметров и сохранить их в db. Таким образом, я могу их прочитать, конвертировать и искать мощность в 2 значения.

Проблема в поиске в ДБ. Скажите, что кто-то ищет a1. Это будет 1, но также и 3, потому что это комбинация a1 и a2.

Так что это путаница. Теперь я пытаюсь сохранить двоичные значения, например 101, и обрабатывать десятичные значения против него. При поиске a1 ИЛИ a2 мне нужно искать (двоичные) 1 и 11. Я не знаю, как это соотнести, и я уверен, что есть лучший подход к этому, не так ли?

+0

, что на самом деле не двоичные данные (блобов, файлы, изображения), но двоичное представление чисел (7 = 111) ... – knittl

+0

мой английский не так уж хорош. Я просто назвал его двоичными данными, но, очевидно, это не blob ... – Mike

ответ

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

Правильно это бит-поле (здесь нет blobs). Не знал английского слова. Я сейчас пробовал этот: AND (field & 3)! = 0 Таким образом, я могу найти все совпадения, включая 1 ИЛИ 2, что отлично. Тот факт, что полное сканирование запускается каждый раз, не так уж велико ... – Mike

Смежные вопросы