2011-06-02 33 views
4

我有一個表,其中一個特定的字符串字段通常包括單引號和雙引號的Unicode內部:分別爲\u0027\u0022。事實證明,我實際上需要他們更多地逃脫。我需要在他們面前增加一個額外的\PostgreSQL中的正則表達式替換

例如,我需要改變\u0027Hello, world\u0027\\u0027Hello, world\\u0027

什麼樣的SQL可用於所有記錄在表上執行這種更新的?

+0

FWIW我正在使用postgresql。獎勵積分,如果您還可以告訴我如何強制所有插入和更新後來執行相同的修改,而不會結束三個斜線。 – 2011-06-02 22:47:29

+2

您最好使用Unicode將數據存儲在數據庫中,並在需要時執行轉義 - 在一天結束時它不會那麼複雜。 – 2011-06-02 23:03:09

+1

這聽起來真的令我懷疑。爲什麼你需要在數據庫中編碼數據?這通常意味着將數據放入或退出的代碼存在一些嚴重問題。數據通常應保存爲原始的非轉義文本格式。 – bobince 2011-06-02 23:05:38

回答

10

如果你真的需要這一點,那麼你可以使用這樣的RE:

UPDATE table SET c = regexp_replace(c, '[^\\]\\(u\d{4})', '\\\\\1', 'g'); 

確保standard_conforming_strings已啓用並regex_flavor設置爲高級。

SHOW standard_conforming_strings; 
standard_conforming_strings 
----------------------------- 
on 
(1 row) 

替換字符串'\\\\\1'指兩個以下反斜槓\\\1代表第一(報告)括號內的子表達式(即,級聯與四位數字'u'從圖案)。

+0

謝謝。我做了兩個變種:一個處理以unicode轉義序列開頭的字符串,另一個保留\ u(你提供的版本消耗它)之前的字符。由於我們的db沒有使用standard_conforming_strings,我還必須加倍反斜槓的數量。 Icky的東西,但它的工作。 – 2011-06-03 19:46:11

+0

@Dan:您也可以使用美元引用$$ pattern $$來避免加倍反斜槓http://www.postgresql.org/docs/9.0/static/sql-syntax-lexical.html#SQL-SYNTAX-DOLLAR- QUOTING – 2011-06-03 19:57:19

1

更新聲明SET yourcolumn = REPLACE(yourcolumn, '\u0027', '\\u0027')應該這樣做。在進行批量更新之前,請先嚐試下面的內容以檢查它是否有效。

SELECT REPLACE('\u0027', '\u0027', '\\u0027') 
+0

+1這看起來很有用,但它似乎無法檢測是否已執行雙重轉義。 – 2011-06-02 23:10:34

+0

......並且存在這個問題,丹 - 請花點時間認真考慮以更合適的格式存儲數據。 – 2011-06-02 23:11:41