是否可以在 PostgreSQL 的 varchar 字段中将所有出现的给定字符(以 unicode 表示)替换为另一个字符(以 unicode 表示)?
我试过这样的事情:
UPDATE mytable
SET myfield = regexp_replace(myfield, '\u0050', '\u0060', 'g')
但似乎它确实在字段中写入了字符串'\u0060',而不是与该代码对应的字符。
是否可以在 PostgreSQL 的 varchar 字段中将所有出现的给定字符(以 unicode 表示)替换为另一个字符(以 unicode 表示)?
我试过这样的事情:
UPDATE mytable
SET myfield = regexp_replace(myfield, '\u0050', '\u0060', 'g')
但似乎它确实在字段中写入了字符串'\u0060',而不是与该代码对应的字符。
根据关于词法结构的 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)
它应该与“与该代码对应的字符”一起使用,除非客户端或食物链中的其他层破坏了您的代码!
此外,使用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');