我有一个包含非UTF-8字符的字符串的表,例如�
。我需要更改它们,以便它们返回所有重音和其他拉丁字符,例如:cap� to capó
。该字段是VARCHAR。
到目前为止,我尝试过:SELECT "Column Name", regexp_replace("Column Name", '[^\w]+','') FROM table
和:
CONVERT("Column Name", 'UTF8', 'LATIN1')
但根本不起作用。
例如,我得到的错误是:“Regexp遇到无效的UTF-8字符(...)”
我见过其他解决方案,但由于我不是管理员,因此我无法更改表格。
有什么可以做到的吗?
答案 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
才能全部翻译。