用SQL替换错误的codificaton字母

时间:2011-11-18 14:02:26

标签: sql postgresql replace

我有一个包含互联网数据的数据库,但有些网页编码错误,ã等字母变为ãç变为ç

有什么可能解决这个问题?我正在使用PostgreSQL。

我可以使用替换,但我需要替换每个案例?我正在考虑翻译,但我发现它只将一个字符转换为其他字符。可以将两个字符翻译成一个吗?类似于:TRANSLATE(text,'ã|ç','ã|ç')

3 个答案:

答案 0 :(得分:3)

这个特殊问题看起来像你有UTF-8编码被解释为单字节字符集(“ç”变成“Ô表示iso-8859-1)。

您可以使用一长串replace(...)来单独解决这些问题。或者您可以使用postgresql自己的字符转换工具:

select convert_from(convert_to('£20 - garçon', 'iso-8859-1'), 'utf-8')

按顺序,这个:

  • 使用iso-8859-1编解码器将字符串转换回二进制文件(假设所有代码点都在256以下,只会将unicode代码点更改回字节)
  • 将二进制输出重新解释为UTF-8,因此{0xc2,0xa3}等序列被翻译为'£'

答案 1 :(得分:1)

你可以通过替换它们来修复一些角色,但不是全部。通过使用错误的编码解码数据,您已经删除了一些信息,这是不可能的。

您应该找出这些页面的正确编码,并在解码数据时使用它。

某些页面在响应标头中具有编码,例如

Content-Type: text/html; charset=utf8

有些页面在HTML头中有编码,例如

<meta http-equiv="content-type" content="text/html; charset=utf-8" />

如果信息不在标题中,您首先必须使用ASCII编码对页面(或至少其中的一部分)进行解码(这不是问题,因为元标记不包含特殊字符),请查找编码,然后使用正确的编码解码页面。

答案 2 :(得分:1)

PostgreSQL有一个字符串替换函数:

replace(string text, from text, to text):用子串string替换from子串to中的所有匹配项

示例:

replace ('abcdefabcdef', 'cd', 'XX') ==> abXXefabXXef