2008-11-18 66 views
0

我试图导入一个大的SQL文件;由一个服务器上的mysqldump创建,然后使用iconv转换;使用这些命令:MySQL在导入时不会保留字符信息

$ 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-事情。正如你所看到的,在这个页面上,另外一个人也对cp1252产生了麻烦;也许这是原因。

的serverversion是:

老主持人:版本10.10 DISTRIB 5.0.18,为PC-Linux的GNU(1486) 新主机:版本10.11 DISTRIB 5.0.51,为PC-Linux的GNU (i686)

回答

0

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

+0

提到在原件的问题;如果我不这样做,mysqldump生成\ xc2 \ x91而不是\ x91。我相信我在与解决方案相同的页面上阅读,mysqldump试图将所有内容都转换为utf-8。在这种情况下,错误地 – 2008-11-18 12:26:20

0

我还没找到工作解决方案;我们将尝试使用脚本,使2个连接和简单地从一个连接选择和更新其他迁移...

-1

尝试: -

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

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

+0

这不是一个论坛。如果您有其他想法,请编辑您的第一个答案 – hop 2008-12-06 15:04:49

0

如果MySQL转换为UTF-8,然后你想:

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

这应该转换公开报价回X “91”。 对于公开报价,“xc291”确实是utf-8。

0

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

最新版本发布5裹表与设定的字符集命令转储,如:

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

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

可能存在/不存在的,这些是影响您的导入?

+0

在主文章中回答您的问题! – 2008-11-20 16:10:06

1

在我的系统上,mysqld默认使用瑞典语整理将数据保存在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。