最近,我们将数据库从SQL_ASCII迁移到UTF8编码。运行应用程序后,我们将开始获得以下错误消息:
编码UTF-8的字符0xc 296在"WIN1252“中没有等效之处。
因此,我们遇到了iconv,转换按以下步骤完成
1-将现有数据库转储为
"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" mydb2-使用biconv/b进行转换
"C:\Program Files\GnuWin32\bin\iconv.exe" -c -f windows-1252 -t UTF-8 C:\UTF8Dump.sql>C:\ConvertedUTF8Dump.sql3创建一个nerw UTF编码DB。
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”问题。
有什么想法吗?
发布于 2012-10-03 06:29:55
您确定源DB是SQL_ASCII吗?
数据库中的文本实际上是用什么编码的?你有可能在里面混合了几种不同的编码吗?这在没有强制执行任何正常编码规则的DBs中并不少见。
0xc296 in utf-8是保卫区域的unicode U+96启动。这似乎是一个相当荒谬的字符,来自一个转换从一个windows-1252的来源。
在utf-8中的0xe2809a是U+201a单引号-9引号.它在ISO8859-15中无效,因此PostgreSQL在这里正确地产生了一个错误。
我想说的是,您的数据库中可能有多个相互不兼容的编码字符串,因此没有一种转换适用于整个数据库。欢迎来到joy,从混合编码的混合混合迁移到一个严格的utf-8环境。
或者,如果您确实知道您的DB是什么编码,并且知道它是一致的,您可以尝试不使用pg_dump,不使用--encoding,然后编辑转储并添加/更改SET client_encoding语句以反映新的编码。如果您没有在转储后更改SET client_encoding,这很可能解释了这个问题,因为您将告诉Pg将您转换成utf-8的数据解释为latin-9或其他什么的。
https://stackoverflow.com/questions/12702854
复制相似问题