0

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

编码 UTF-8 的字符 0xc296 在“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" 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-encoded DB

4 从第 2 步导入 sql

我们摆脱了错误,但是

在我们得到的其他一些系统上

迁移到 UTF8 后,编码 UTF-8 的字符 0xe2809a 在“LATIN9”问题中不等价

所以我们尝试了相同的上述步骤,但不同的转换是这样的

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

但错误仍然是

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

有任何想法吗?

4

1 回答 1

2

确定源数据库是SQL_ASCII

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

0xc296inutf-8unicode U+96 START OF GUARDED AREA。来自 windows-1252 源的转换似乎是一个非常荒谬的角色。

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

我想说您的数据库中可能有多个相互不兼容的编码字符串,因此没有一种转换适用于整个数据库。欢迎享受从混杂的混合编码迁移到严格的 utf-8 环境的乐趣。

或者,如果您确定您的数据库是什么编码并且知道它是一致的,您可以尝试不pg_dump使用数据库,然后编辑转储并添加/更改语句以反映新编码。如果您在 之后没有更改转储中的,那可能很好地解释了问题,因为您会告诉 Pg 将您转换为的数据解释为好像它是或其他的一样。--encodingiconvSET client_encodingSET client_encodingiconvutf-8latin-9

于 2012-10-03T06:29:55.413 回答