Хранение/запрос бинарных последовательностей и поиск по маскам

Я нашел хороший способ хранить некоторые данные в базе данных с помощью двоичной последовательности, например 0b0101000, и находить строки, дающие положительный результат после применения маски.

Например: SELECT (0b0101010 & (1<<3 | 1<<5))>0; позволяет мне получать строки с 3-м или 5-м битом, независимо от того, включены или выключены другие биты.

Проблема в том, что я хочу сделать это с помощью ActiveRecord. Эта миграция add_column :table, :column, :binary, :limit => 8.bytes фактически создает столбец TINYBLOB, а не столбец BINARY или VARBINARY, и я не могу применить свою маску к его значению, поскольку оно не считается двоичным значением.

Я знаю, что мог бы сделать правильный формат столбца при миграции, выполнив необработанный оператор SQL, а затем запросить мою таблицу с необработанными сегментами SQL для этой части, но это не похоже на «Путь Rails».

Спасибо за любую идею.


person jlecour    schedule 06.07.2010    source источник


Ответы (2)


На самом деле, это не оптимально, но, по крайней мере, можно хранить эту последовательность в столбце TINYBLOB.

Я могу запросить базу данных следующим образом

SELECT * FROM table WHERE (column & mask) = mask

Например, со значением в столбце 10110110 и маской с 128 (100000000) будет выбрана строка.

Но мне пришлось построить conditions часть запроса со строкой; нет условий на основе has и нет заполнителя.

Вот полный (фиктивный) пример на Ruby:

find_conditions = []

find_conditions[0] = 'string_col = ?'
find_conditions << 'a_value_for_the_string_col'

binary_mask = "01100101"
find_conditions[0] += ' AND '
find_conditions << "(bin_col & #{binary_mask.to_i(2)}) = #{binary_mask.to_i(2)}"

results = Model.all(:conditions => find_conditions)
person jlecour    schedule 06.07.2010

вы не можете через активную запись:

http://www.packtpub.com/article/Working-with-Rails-ActiveRecord-Migrations-Models-Scaffolding-and-Database-Completion

смотрите в таблице:

Тип столбца переноса | Преобразует в тип поля MySQL | Доступные варианты1

:двоичный | TINYBLOB, BLOB, MEDIUMBLOB или LONGBLOB2 | предел => от 1 до 4294967296 (по умолчанию = 65536)2

person Haim Evgi    schedule 06.07.2010