2013-03-03 115 views
6

是否有可能用PostgreSQL中的varchar字段中的另一個字符(用unicode表示)替換給定字符(以unicode表示)的所有出現?在PostgreSQL中替換unicode字符

我想是這樣的:

UPDATE mytable 
SET myfield = regexp_replace(myfield, '\u0050', '\u0060', 'g') 

但它似乎真的寫在該領域的字符串「\ u0060」,而不是對應於該代碼的字符。

回答

11

按照PostgreSQL documentation on lexical structure,你應該使用U&語法:

UPDATE mytable 
SET myfield = regexp_replace(myfield, U&'\0050', U&'\0060', 'g') 

您也可以使用PostgreSQL相關逃避字符串形式E'\u0050'。這可以在比unicode轉義表單更早的版本上工作,但unicode轉義表單是較新版本的首選。這應該顯示是怎麼回事:

regress=> SELECT '\u0050', E'\u0050', U&'\0050'; 
?column? | ?column? | ?column? 
----------+----------+---------- 
\u0050 | P  | P 
(1 row) 
+0

謝謝!有效 ;) – user1923631 2013-03-04 09:44:15

3

它應與「所對應的代碼字符」的工作,除非進來食物鏈客戶端或其他層軋液你的代碼!

此外,使用translate() or replace()這個簡單的工作。比regexp_replace()快得多。 translate()也適用於多次簡單替換。
並避免空更新WHERE子句。現在快得多了,並且避免了桌子船和額外的VACUUM成本。

UPDATE mytable 
SET myfield = translate(myfield, 'P', '`') -- actual characters 
WHERE myfield <> translate(myfield, 'P', '`'); 

如果繼續運行到問題,請使用提供的編碼@mvp

UPDATE mytable 
SET myfield = translate(myfield, U&'\0050', U&'\0060') 
WHERE myfield <> translate(myfield, U&'\0050', U&'\0060');