在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'写入了该字段,而不是与该代码相对应的字符。
U&
语法:UPDATE mytable
SET myfield = regexp_replace(myfield, U&'\0050', U&'\0060', 'g')
E'\u0050'
。这将适用于旧版本,但新版本更喜欢使用Unicode转义形式。这应该能说明情况:regress=> SELECT '\u0050', E'\u0050', U&'\0050';
?column? | ?column? | ?column?
----------+----------+----------
\u0050 | P | P
(1 row)
除非某个客户端或其他层次的处理程序破坏您的代码,否则它应该与“对应于该代码的字符”一起工作!
此外,对于这个简单的任务,请使用translate()
或replace()
。比regexp_replace()
快得多。 translate()
也适用于同时进行多个简单替换。
并避免使用带有WHERE
子句的空更新。速度更快,避免了表格膨胀和额外的VACUUM
成本。
UPDATE mytable
SET myfield = translate(myfield, 'P', '`') -- actual characters
WHERE myfield <> translate(myfield, 'P', '`');
UPDATE mytable
SET myfield = translate(myfield, U&'\0050', U&'\0060')
WHERE myfield <> translate(myfield, U&'\0050', U&'\0060');