0

我正在尝试导入一个大型 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 

任何人都知道这是怎么发生的以及如何防止它发生?知道了这一点,我应该能够完全按原样迁移数据。

额外的信息:

将此来源用于 iconv-things。如您所见,在此页面上,另一个人也遇到了 cp1252 的问题;也许这就是原因。

服务器版本是:

旧主机:Ver 10.10 Distrib 5.0.18,适用于 pc-linux-gnu (i486) 新主机:Ver 10.11 Distrib 5.0.51,适用于 pc-linux-gnu (i686)

4

6 回答 6

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。

于 2008-12-06T14:54:47.683 回答
0

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

于 2008-11-18T12:19:23.993 回答
0

你用的是什么版本的mysqldump?

最近的版本 5 发布了使用设置字符集的命令包装表转储,例如:

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

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

这些的存在/不存在会影响您的进口吗?

于 2008-11-20T14:15:16.240 回答
0

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

于 2008-11-19T14:32:03.663 回答
0

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

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

这应该将打开的报价转换回 x"91"。“xc291”确实是用于公开报价的 utf-8。

于 2008-11-19T15:22:37.150 回答
-1

尝试:-

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

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

于 2008-11-19T15:12:08.170 回答