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

3
我找到了一种在数据库中存储二进制序列数据并在应用掩码后查找正结果的好方法,例如:0b0101000
例如:SELECT (0b0101010 & (1<<3 | 1<<5))>0;可以让我获取第3位或第5位为1的行,无论其他位是开还是关。
问题是当我想在ActiveRecord中执行此操作时。这个迁移add_column :table, :column, :binary, :limit => 8.bytes实际上创建了一个TINYBLOB列而不是BINARYVARBINARY,并且我不能对其值应用掩码,因为它不被视为二进制值。
我知道我可以通过执行原始SQL语句来在迁移中设置正确的列格式,然后使用原始SQL片段查询我的表格,但这似乎不是“Rails Way”。
感谢任何想法。
2个回答

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)

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接