2013-03-03 119 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');