替换PostgreSQL中的unicode字符

时间:2013-03-03 19:51:07

标签: postgresql unicode replace sql-update

是否可以用PostgreSQL中varchar字段中的另一个字符(以unicode表示)替换给定字符的所有出现(以unicode表示)?

我试过这样的事情:

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

但它似乎确实在字段中写了字符串'\ u0060'而不是与该代码对应的字符。

2 个答案:

答案 0 :(得分:12)

根据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)

答案 1 :(得分:5)

它应该与“代码对应的字符”一起使用,除非食物链中的客户端或其他层破坏了您的代码!

另外,使用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');