MySQL导出/导入中会丢失特殊字符

时间:2012-06-25 07:47:07

标签: mysql utf-8 character-encoding latin1

我试图将MySQL 3.23.58数据库移动到运行5.5.19的其他服务器上。

旧的指定了latin1编码,据我所知,底层数据确实是老实说latin1。我尝试了很多东西,主要是:

  • 使用mysqldump和latin1编码标志从终端导出。
  • 在vim中编辑以更改" TYPE = InnoDB"到" ENGINE = InnoDB" for MySQL 5兼容性。
  • 从终端导入新服务器。

浏览旧服务器(在Sequel Pro for Mac或在PC上使用MySQL查询浏览器),特殊字符不会总是正确显示,但它们会在那里(以十六进制查看二进制文件)。 (无论如何,它适用于PHP Web应用程序。)

浏览新服务器时,所有特殊字符似乎都被问号所取代。我知道如果指定了错误的编码,有时特殊字符可以显示为问号(或�)。但这些似乎是二进制级别的真正的直接编码ASCII问号。在导出/导入中,特殊字符(主要是卷曲引号和破折号)似乎已丢失或被破坏。

知道为什么吗?

我知道编码有很多可能出错的地方,有很多不同的东西都有问题。我已经阅读了好几天(在这里和其他地方),尝试设置所有正确的字符编码,尝试UTF-8,尝试投射和转换,尝试了Sequel Pro的导出/导入(而不是终端)等等。但我很难过。

1 个答案:

答案 0 :(得分:2)

好,看起来我们已经缩小了你的问题。我找到了this post

  

如果您的文本编辑器是vim,则很可能是“< 92>”是个   扩展ASCII字符的十六进制代码。在这种情况下,它是   十六进制(92)或十月(222)或十二进制(146),这是“右单引号”   标记“;不要与”单引号“混淆,后者是ASCII Dec代码39。

     

从文件中删除所有非ASCII字符的一种方法可能是 -

     

perl -plne 's/[^[:ascii:]]//g' <your_file>

否则只需搜索并替换“&lt; 92&gt;”和“&lt; 97&gt;”在导出的文件中使用适当的字符。

<强> [编辑]

我不是VIM用户,但这篇文章解决了replacing the <92> smart quote characters

的问题
  

对于您在文件中看到的每个值,只需执行一个字符串   替换,像这样:

     

:%s/<93>/\’/g

     

当然,你不能只输入&lt; 93&gt;在那里,所以要进去   你在那里使用

     

CTRL-V x 93

     

将hex 93插入到位。

     

在最近从excel导出的CSV中,我看到了hex 91-97。