【问题标题】:Storing/querying binary sequences and searching with masks存储/查询二进制序列和使用掩码搜索
【发布时间】:2010-07-06 23:14:21
【问题描述】:

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

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

问题是当我想使用 ActiveRecord 执行此操作时。 这种迁移add_column :table, :column, :binary, :limit => 8.bytes 实际上创建了一个TINYBLOBcolumn 而不是BINARYVARBINARY,我无法将我的掩码应用于它的值,因为它不被视为二进制值。

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

感谢您的任何想法。

【问题讨论】:

    标签: mysql ruby-on-rails binary mask


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      你不能通过 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

      【讨论】:

        猜你喜欢
        • 2016-01-10
        • 2017-07-06
        • 2014-03-22
        • 2013-10-29
        • 1970-01-01
        • 2019-03-11
        • 2020-04-13
        • 1970-01-01
        • 2018-07-21
        相关资源
        最近更新 更多