2013-01-12 51 views
3

我在数据库中存储了一个240字节(1920位)的二进制字符串(但是我想保持数据库独立)。按位异或,SQL中的固定长度二进制字符串(240字节)

我需要做到以下几点:

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

我相信SQL语法逐位异或只适用于值高达6B位。

我在文本字段中使用十六进制编码存储数据,但是如果需要,我可以将其更改为保存二进制数据的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

您可以避免突出显示的数据一致性问题的一种方法是在事务中执行读取/计算/更新。 – PeterJ

+0

我不认为每个服务器上的按位操作都是标准化的。你最好先得到一个适用于当前数据库的工具。 –

回答

1

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

它们很快并且很好地集成到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ÇUDF的有许多例子资源。 http://doxygen.postgresql.org/

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