导入时MySQL不会维护字符信息

时间:2008-11-18 12:11:33

标签: mysql encoding migration

我正在尝试导入一个大型SQL文件;由mysqldump在一台服务器上创建,然后用iconv转换;使用这些命令:

$ mysqldump -uxxx -p xxx > data.sql
$ iconv -f UTF-8 -t ISO-8859-1//TRANSLIT data.sql data.iconv.sql

我注意到数据库中的“\ x91”在转储中变成了“\ xc3 \ x82 \ xc2 \ x91”,因为mysqldump尝试将所有内容转换为utf-8。我用iconv将它转换回“\ x91”。如果我不转换它们,它们最终会成为新服务器上的“\ xc2 \ x3f”;而不仅仅是我们现在的“\ x3f”。

因此,如前所述,cp1252编码有一些独特的字符,例如“\ x91”和“\ x92”。这两个字符在新数据库中都转为“\ x3f”;这是我用来导入的命令:

$ /opt/mysql5/bin/mysql -uxxx -p -Dxxx < data.iconv.sql 

有人知道这可能会发生什么以及如何防止这种情况发生?知道了这一点,我应该能够完全按原样迁移数据。

额外信息:

我使用this source作为iconv-things。正如你所看到的,在这个页面上,另一个人也遇到了cp1252的麻烦;也许这就是原因。

服务器版本是:

old-host:Ver 10.10 Distrib 5.0.18,适用于pc-linux-gnu(i486) new-host:Ver 10.11 Distrib 5.0.51,适用于pc-linux-gnu(i686)

6 个答案:

答案 0 :(得分:1)

在我的系统上,mysqld默认使用swedish排序规则在latin1中保存数据。同样,mysql命令行客户端默认使用latin1提供数据。另一方面,mysqldump默认为utf-8。

这会导致通过mysqldump导出数据然后使用mysql命令行客户端导入时出现问题 - 这两个字符集不常见的字符会发生变异。

解决方案是让mysqldump使用能够正确设置mysql客户端字符集的其他命令来装饰数据:

mysqldump --set-charset ...

默认情况下,这会将“set name = utf-8”添加到转储数据中。现在可以通过mysql客户端干净地导入它。

附加选项“--default-character-set=xxx”可以与mysqldump一起使用,将转储转换为utf-8以外的其他内容。

使用-set-charset选项可以防止您完全使用iconv。

答案 1 :(得分:0)

如果您的数据是cp1252,为什么要告诉iconv它的utf-8?

答案 2 :(得分:0)

我还没有找到可行的解决方案;我们将尝试使用创建2个连接的脚本进行迁移,只需从一个连接中选择并更新另一个连接......

答案 3 :(得分:0)

如果mysql正在转换为utf-8,那么你想要:

iconv -f utf-8 -t IBM-1252 xxxx

这应该将开放报价转换回x“91”。 对于公开报价,“xc291”真的是utf-8。

答案 4 :(得分:0)

您使用的是什么版本的mysqldump?

最新版本5发布包装表转储,其中包含设置字符集的命令,例如:

SET @saved_cs_client     = @@character_set_client;
SET character_set_client = utf8;

CREATE TABLE ...
...
...
SET character_set_client = @saved_cs_client;

这些存在/不存在会影响您的导入吗?

答案 5 :(得分:-1)

尝试: -

iconv -f IBM-1252 -t ISO-8859-1

不确定为什么我之前的回复已被标记下来。 utf-8不是ASCII!所有7位utf字符都与7位ASCI字符集相同,但第一位b'1000000'在UTF-8中具有特殊含义,表示该字符是unicode两个三或四字节字符。