我有一個表,其中一個特定的字符串字段通常包括單引號和雙引號的Unicode內部:分別爲\u0027
和\u0022
。事實證明,我實際上需要他們更多地逃脫。我需要在他們面前增加一個額外的\
。PostgreSQL中的正則表達式替換
例如,我需要改變\u0027Hello, world\u0027
到\\u0027Hello, world\\u0027
什麼樣的SQL可用於所有記錄在表上執行這種更新的?
我有一個表,其中一個特定的字符串字段通常包括單引號和雙引號的Unicode內部:分別爲\u0027
和\u0022
。事實證明,我實際上需要他們更多地逃脫。我需要在他們面前增加一個額外的\
。PostgreSQL中的正則表達式替換
例如,我需要改變\u0027Hello, world\u0027
到\\u0027Hello, world\\u0027
什麼樣的SQL可用於所有記錄在表上執行這種更新的?
如果你真的需要這一點,那麼你可以使用這樣的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'
從圖案)。
謝謝。我做了兩個變種:一個處理以unicode轉義序列開頭的字符串,另一個保留\ u(你提供的版本消耗它)之前的字符。由於我們的db沒有使用standard_conforming_strings,我還必須加倍反斜槓的數量。 Icky的東西,但它的工作。 – 2011-06-03 19:46:11
@Dan:您也可以使用美元引用$$ pattern $$來避免加倍反斜槓http://www.postgresql.org/docs/9.0/static/sql-syntax-lexical.html#SQL-SYNTAX-DOLLAR- QUOTING – 2011-06-03 19:57:19
更新聲明SET yourcolumn = REPLACE(yourcolumn, '\u0027', '\\u0027')
應該這樣做。在進行批量更新之前,請先嚐試下面的內容以檢查它是否有效。
SELECT REPLACE('\u0027', '\u0027', '\\u0027')
+1這看起來很有用,但它似乎無法檢測是否已執行雙重轉義。 – 2011-06-02 23:10:34
......並且存在這個問題,丹 - 請花點時間認真考慮以更合適的格式存儲數據。 – 2011-06-02 23:11:41
FWIW我正在使用postgresql。獎勵積分,如果您還可以告訴我如何強制所有插入和更新後來執行相同的修改,而不會結束三個斜線。 – 2011-06-02 22:47:29
您最好使用Unicode將數據存儲在數據庫中,並在需要時執行轉義 - 在一天結束時它不會那麼複雜。 – 2011-06-02 23:03:09
這聽起來真的令我懷疑。爲什麼你需要在數據庫中編碼數據?這通常意味着將數據放入或退出的代碼存在一些嚴重問題。數據通常應保存爲原始的非轉義文本格式。 – bobince 2011-06-02 23:05:38