4

我正在尝试将 MySQL 3.23.58 数据库移动到运行 5.5.19 的不同服务器。

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

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

浏览旧服务器(在 Mac 上的 Sequel Pro 或 PC 上的 MySQL 查询浏览器中),特殊字符并不总是正确显示,但它们就在那里(查看十六进制的二进制文件)。(在任何情况下,它都适用于 PHP Web 应用程序。)

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

知道为什么吗?

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

4

1 回答 1

2

很好,看来我们已经缩小了您的问题范围。我找到了这篇文章

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

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

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

否则,只需在导出的文件中搜索并用适当的字符替换“<92>”和“<97>”。

[编辑]

我不是 VIM 用户,但这篇文章解决了替换 <92> 智能引号字符的问题

对于您在文件中看到的每个值,只需进行字符串替换,如下所示:

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

当然,您不能只在其中键入 <93>,因此要在其中输入它,请使用

CTRL-V x 93

它将十六进制 93 插入到位。

在最近从 excel 导出的 CSV 中,我看到了十六进制 91-97。

于 2012-06-26T09:35:50.860 回答