Хранение / запрос двоичных последовательностей и поиск по маскам - PullRequest
3 голосов
/ 06 июля 2010

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

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 06 июля 2010

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

Я могу запросить базу данных, как это

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

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

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

Вот полный (фиктивный) пример в 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)
0 голосов
/ 06 июля 2010

вы не можете через activerecord:

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

...