【问题标题】:Replace unicode characters in PostgreSQL替换 PostgreSQL 中的 unicode 字符
【发布时间】:2013-02-17 20:43:26
【问题描述】:

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

我尝试过这样的事情:

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

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

【问题讨论】:

    标签: postgresql unicode replace sql-update


    【解决方案1】:

    根据PostgreSQL documentation on lexical structure,你应该使用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)
    

    【讨论】:

      【解决方案2】:

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

      另外,使用translate() or replace() 完成这项简单的工作。比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');
      

      【讨论】:

        猜你喜欢
        • 2016-07-02
        • 2018-04-19
        • 2011-04-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-14
        • 1970-01-01
        相关资源
        最近更新 更多