最近我们将数据库从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
"C:\Program Files\GnuWin32\bin\iconv.exe" -c -f windows-1252 -t UTF-8 C:\UTF8Dump.sql>C:\ConvertedUTF8Dump.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后的问题
任何想法?
答案 0 :(得分:2)
您确定源数据库是SQL_ASCII
吗?
数据库中的文本实际上是什么编码?你有可能混合使用几种不同的编码吗?对于没有强制执行任何合理编码规则的DB来说,这并不罕见。
0xc296
中的{p> utf-8
为unicode U+96 START OF GUARDED AREA。这似乎是一个非常荒谬的角色来自Windows-1252源的转换。
utf-8中的 0xe2809a
为unicode 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
或其他什么。