2013-01-12 99 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的用戶定義類型和操作符。

相關問題