在SQL中的固定长度二进制字符串(240字节)上的按位异或

时间:2013-01-12 05:03:01

标签: sql string bit-manipulation binary-data

我在数据库中存储了一个240字节(1920位)的二进制字符串(目前是MySQL,但我想保持数据库无关)。

我需要做以下事情:

UPDATE `my_table` SET `data` = `data` ^ 'new_data' WHERE `id` = 'field_id'

我相信SQL语法的逐位XOR仅适用于最多6位的值。

我在文本字段中使用十六进制编码存储数据,但是如果需要,我可以将其更改为包含二进制数据的blob字段。

目前我正在使用PHP加载该字段。然后我正在进行XOR并将其写回来。

但是,此字段对所有脚本都是全局的,并且此方法存在以下风险:

Script X Loads Data0
Script Y Loads Data0
Script X Generates Data1 = Data0 ^ new_data1
Script Y Generates Data2 = Data0 ^ new_data2
Script X writes Data1
Script Y writes Data2 Error: dosen't contain new_data1

如果这是通过SQL语句完成的,那么将是以下内容:

UPDATE `my_table` SET `data` = `data` ^ 'new_data1' WHERE `id` = 'field_id'
UPDATE `my_table` SET `data` = `data` ^ 'new_data2' WHERE `id` = 'field_id'

数据库将通过避免上面指出的错误在那里顺序执行查询

如果我使用64位整数来存储这些数据,那么由于大小的原因,我不得不将其分解为30个单独的值。这个选项不合理。

有没有人知道实现此目的的数据库无关方式?

1 个答案:

答案 0 :(得分:1)

考虑编写C语言用户定义函数(UDF)来执行此操作。许多数据库MySQL,PostgreSQL,Oracle,....支持C UDF。

它们很快并且很好地集成到SQL中,因为它们像任何其他存储过程一样被调用。不幸的是,每个数据库的创建语法和绑定API都不同。

这是MySQL的文档

http://dev.mysql.com/doc/refman/5.0/en/udf-compiling.html

和MySQL的Codeproject示例

http://www.codeproject.com/Articles/15643/MySQL-User-Defined-Functions

和PostgreSQL文档http://www.postgresql.org/docs/9.2/static/xfunc-c.html

在PostgreSQL源代码中有很多C UDF的例子。 http://doxygen.postgresql.org/

PostgreSQL使UDF更进一步,并允许创建基于C的用户定义类型和操作符。