在PostgreSQL中替换Unicode字符

7

在PostgreSQL的varchar字段中,是否可以将所有出现的特定字符(以Unicode表示)替换为另一个字符(以Unicode表示)?

我尝试过类似于以下内容的操作:

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

但是似乎它真正将字符串'\u0060'写入了该字段,而不是与该代码相对应的字符。

2个回答

13
根据PostgreSQL词法结构文档,应使用U&语法:
UPDATE mytable 
SET myfield = regexp_replace(myfield, U&'\0050', U&'\0060', 'g')

你也可以使用PostgreSQL特定的转义字符串形式E'\u0050'。这将适用于旧版本,但新版本更喜欢使用Unicode转义形式。这应该能说明情况:
regress=> SELECT '\u0050', E'\u0050', U&'\0050';
 ?column? | ?column? | ?column? 
----------+----------+----------
 \u0050   | P        | P
(1 row)

5

除非某个客户端或其他层次的处理程序破坏您的代码,否则它应该与“对应于该代码的字符”一起工作!

此外,对于这个简单的任务,请使用translate()replace()。比regexp_replace()快得多。 translate()也适用于同时进行多个简单替换。
并避免使用带有WHERE子句的空更新。速度更快,避免了表格膨胀和额外的VACUUM成本。

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

如果您一直遇到问题,请使用@mvp提供的编码:@mvp
UPDATE mytable
SET   myfield =  translate(myfield, U&'\0050', U&'\0060')
WHERE myfield <> translate(myfield, U&'\0050', U&'\0060');

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接