存储/查询二进制序列并使用掩码进行搜索

时间:2010-07-06 08:50:19

标签: mysql ruby-on-rails binary mask

我找到了一种很好的方法,可以使用二进制序列(例如0b0101000)在数据库中存储一些数据,并找到在应用掩码后给出正结果的行。

例如:SELECT (0b0101010 & (1<<3 | 1<<5))>0;允许我获取第3或第5位的行,无论其他位是打开还是关闭。

问题是我想用ActiveRecord做这件事。 此迁移add_column :table, :column, :binary, :limit => 8.bytes实际上创建了TINYBLOB列,而不是BINARYVARBINARY,我无法将掩码应用于其值,因为它不被视为二进制值

我知道我可以通过执行原始SQL语句在迁移中创建正确的列格式,然后使用原始SQL段查询我的表,但它看起来不像“Rails方式”。

感谢您的任何想法。

2 个答案:

答案 0 :(得分:2)

事实上,它并不是最优的,但至少它可以将这个序列存储在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)

答案 1 :(得分:0)

你不能通过activerecord:

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

见表:

迁移列类型|转换为MySQL字段类型|可用选项1

:二进制| TINYBLOB,BLOB,MEDIUMBLOB或LONGBLOB2 | limit =&gt; 1至4294967296(默认值= 65536)2

相关问题