代码之家  ›  专栏  ›  技术社区  ›  gx.

mysql在导入时不会维护字符信息

  •  0
  • gx.  · 技术社区  · 17 年前

    我正在尝试导入一个大型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的事情。正如你所看到的,在这一页上,另一个人也遇到了CP1252的问题,也许这就是原因。

    服务器版本为:

    旧主机:10.10版Distrib 5.0.18,用于PC Linux GNU(i486) 新主机:Ver10.11 Distrib 5.0.51,适用于PC Linux GNU(i686)

    6 回复  |  直到 17 年前
        1
  •  1
  •   jophab    9 年前

    在我的系统中,mysqld默认使用瑞典语排序规则以latin1保存数据。类似地,mysql命令行客户机默认使用latin1提供数据。另一方面,mysqldump默认为utf-8。

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

    解决方案是让mysqldump使用其他命令来修饰数据,这些命令将正确设置mysql客户端字符集:

    mysqldump --set-charset ...
    

    默认情况下,这将添加“ set name = utf-8 “在被丢弃的数据中。现在可以通过MySQL客户端干净地导入。

    附加选项“ --default-character-set=xxx “可以与MySQL LoIP一起使用,将转储转换成UTF-8以外的其他内容。

    使用 -set-charset 选项应该可以使您完全不必使用iconv。

        2
  •  0
  •   James Anderson    17 年前

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

        3
  •  0
  •   gx.    17 年前

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

        4
  •  0
  •   Martin    17 年前

    你在使用什么版本的mysqldump?

    最新版本5使用设置字符集的命令来释放换行表转储,例如:

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

    这些东西的存在/不存在会影响你们的进口吗?

        5
  •  0
  •   Undo ptrk    9 年前

    如果mysql正在转换为utf-8,则需要:

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

    这将把打开的引号转换回x“91”。 “xc291”实际上是开放式报价的utf-8。

        6
  •  -1
  •   James Anderson    17 年前

    尝试:

    ICONV-F IBM-1252-T ISO-8859-1标准

    不知道为什么我先前的答复被否决了。 utf-8不是ascii!所有7bit utf字符都与7位asci字符集相同,但第一位b'1000000'在utf-8中有特殊含义,表示该字符是unicode两个三字节或四字节字符。