我在数据库中存储了一个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个单独的值。这个选项不合理。
有没有人知道实现此目的的数据库无关方式?
答案 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的用户定义类型和操作符。