7

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

我试过这样的事情:

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

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

4

2 回答 2

13

根据关于词法结构的 PostgreSQL 文档,您应该使用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)
于 2013-03-03T19:58:26.487 回答
5

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

此外,使用translate()orreplace()来完成这个简单的工作。比 快得多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');
于 2013-03-03T20:22:02.920 回答