从String中替换非UTF-8

时间:2018-03-15 11:53:38

标签: postgresql utf-8 character-encoding

我有一个包含非UTF-8字符的字符串的表,例如。我需要更改它们,以便它们返回所有重音和其他拉丁字符,例如:cap� to capó。该字段是VARCHAR。

到目前为止,我尝试过:SELECT "Column Name", regexp_replace("Column Name", '[^\w]+','') FROM table

和: CONVERT("Column Name", 'UTF8', 'LATIN1')但根本不起作用。

例如,我得到的错误是:“Regexp遇到无效的UTF-8字符(...)”

我见过其他解决方案,但由于我不是管理员,因此我无法更改表格。

有什么可以做到的吗?

1 个答案:

答案 0 :(得分:2)

如果数据库编码为UTF8,那么 all 您的字符串将只包含 UTF8字符。他们恰好是你想要的不同角色。

首先,你必须找出字符串中的字符。在您显示的情况下, 是Unicode代码点FFFD(十六进制)。

因此,您可以使用PostgreSQL中的replace函数将其替换为ó(Unicode代码点F3),如下所示:

SELECT replace(mycol, E'\uFFFD', E'\u00f3') FROM mytab;

这使用PostgreSQL的Unicode字符文字语法;不要忘记使用E为所有带有转义符的字符串添加前缀,以扩展字符串文字语法。

有可能这个角色不是真的 ,因为那是经常用来代表不可表现的角色的“替换角色”。

在这种情况下,使用psql并运行如下查询以显示字段的十六进制UTF-8内容:

SELECT mycol::bytea FROM mytab WHERE id = 12345;

根据角色的UTF-8编码,您可以推断出它的真实含义,并在调用replace时使用该字符。

如果您有多个字符,则需要多次调用replace才能全部翻译。