编码UTF-8的字符0xe2809a在" LATIN9"中没有等价。迁移到UTF8后

时间:2012-10-03 06:19:25

标签: postgresql utf-8 character-encoding psql

最近我们将数据库从SQL_ASCII迁移到UTF8编码。运行应用程序后,我们开始收到错误消息,如

  

编码UTF-8的字符0xc296在“WIN1252”

中没有等效字符

所以我们遇到了iconv和 转换按以下步骤完成

将现有数据库转储为

"C:\Program Files\PostgreSQL\9.0\bin/pg_dump.exe" --host localhost --port  5433 --username "myadmin" --format plain --encoding UTF8 --verbose --file "C:\UTF8Dump.sql" mydb

使用[b] iconv [/ b]

进行2转换
 "C:\Program Files\GnuWin32\bin\iconv.exe"  -c  -f windows-1252 -t UTF-8 C:\UTF8Dump.sql>C:\ConvertedUTF8Dump.sql

3创建一个nerw UTF编码的数据库

4从步骤#2

导入sql

我们摆脱了错误,但

在我们得到的其他系统上

  

编码UTF-8的字符0xe2809a在“LATIN9”中没有等效   迁移到UTF8后的问题

所以我们尝试了相同的上述步骤,并进行了不同的转换 像这样

"C:\Program Files\GnuWin32\bin\iconv.exe"  -c  -f ISO-8859-15 -t UTF-8  C:\UTF8Dump.sql>C:\ConvertedUTF8Dump.sql

但错误仍然是

  

编码UTF-8的字符0xe2809a在“LATIN9”中没有等效字符   迁移到UTF8后的问题

任何想法?

1 个答案:

答案 0 :(得分:2)

确定源数据库是SQL_ASCII吗?

数据库中的文本实际上是什么编码?你有可能混合使用几种不同的编码吗?对于没有强制执行任何合理编码规则的DB来说,这并不罕见。

0xc296中的{p> utf-8unicode U+96 START OF GUARDED AREA。这似乎是一个非常荒谬的角色来自Windows-1252源的转换。

utf-8中的

0xe2809aunicode U+201a SINGLE LOW-9 QUOTATION MARK。它在ISO-8859-15中无效,因此PostgreSQL在这里正确产生错误。

我会说你的数据库中可能有多个互不兼容的编码字符串,所以没有一个转换适用于整个数据库。欢迎从混合编码的错误迁移到严格的utf-8环境中。

或者,如果您确定数据库的编码是什么并且知道它是一致的,那么您可以在没有pg_dump--encoding数据库的情况下尝试iconv,然后编辑转储和添加/更改SET client_encoding语句以反映新编码。如果您在SET client_encoding之后没有更改转储中的iconv,那么可能很好地解释了问题,因为您要告诉Pg解释您转换为utf-8的数据,就像它是latin-9或其他什么。