替换PostgreSQL中的unicode字符

use*_*631 6 postgresql unicode replace sql-update

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

我试过这样的事情:

UPDATE mytable 
SET myfield = regexp_replace(myfield, '\u0050', '\u0060', 'g')
Run Code Online (Sandbox Code Playgroud)

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

mvp*_*mvp 12

根据关于词法结构PostgreSQL文档,你应该使用U&语法:

UPDATE mytable 
SET myfield = regexp_replace(myfield, U&'\0050', U&'\0060', 'g')
Run Code Online (Sandbox Code Playgroud)

您还可以使用PostgreSQL特定的转义字符串形式E'\u0050'.这将适用于比unicode转义表单更旧的版本,但对于较新的版本,首选unicode转义表单.这应该显示正在发生的事情:

regress=> SELECT '\u0050', E'\u0050', U&'\0050';
 ?column? | ?column? | ?column? 
----------+----------+----------
 \u0050   | P        | P
(1 row)
Run Code Online (Sandbox Code Playgroud)


Erw*_*ter 5

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

另外,使用translate()replace()进行此简单的工作。比快得多regexp_replace()translate()一次也可用于多个简单替换。
并避免使用子句进行空更新WHERE。速度更快,并且避免了餐桌船和其他VACUUM费用。

UPDATE mytable
SET    myfield  = translate(myfield, 'P', '`')  -- actual characters
WHERE  myfield <> translate(myfield, 'P', '`');
Run Code Online (Sandbox Code Playgroud)

如果仍然遇到问题,请使用提供的@mvp编码:

UPDATE mytable
SET   myfield =  translate(myfield, U&'\0050', U&'\0060')
WHERE myfield <> translate(myfield, U&'\0050', U&'\0060');
Run Code Online (Sandbox Code Playgroud)