使用不同的character_set%在两个MySQL之间迁移数据,与utf8混淆

时间:2010-07-18 04:04:35

标签: mysql character-encoding utf-8

将数据从MySQL server1迁移到MySQL server2

server1 Ver 14.12 Distrib 5.0.51a,debian-linux-gnu(x86_64)使用readline 5.2

mysql> SHOW VARIABLES LIKE 'character_set%';
+--------------------------+------------------------------------------+
| Variable_name            | Value                                    |
+--------------------------+------------------------------------------+
| character_set_client     | utf8                                     |
| character_set_connection | utf8                                     |
| character_set_database   | utf8                                     |
| character_set_filesystem | binary                                   |
| character_set_results    | utf8                                     |
| character_set_server     | latin1                                   |
| character_set_system     | utf8                                     |
| character_sets_dir       | /data/mysql/gabino/share/mysql/charsets/ |
+--------------------------+------------------------------------------+
8 rows in set

server2 Ver 14.12 Distrib 5.0.90,pc-linux-gnu(x86_64)使用readline 6.0

mysql> SHOW VARIABLES LIKE 'character_set%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set

Server1 MySQL是Wordpress博客的后端,从前端一切正常,直到我(不幸的人)必须迁移数据,所以我登录了PhpMyAdmin和MySQL控制台。现在从后端开始,似乎server1中的每个东亚字符都搞砸了,无论是在console或mysqldump文件中的SELECT查询中。症状是,例如,中文字符变成了三个latin1字符看,这是相同的结果SELECT _latin1'看'的UTF8表示为\xe7\x9c\x8b,因此MySQL以某种方式直接将每个字节显示为单独的latin1字符,而不是将3个字节作为中文字符。

即使我使用Navicat 8中的“数据传输”功能将两个数据库从server1复制到server2,服务器2上运行的新博客也会搞乱字符。我尝试了各种方法,如SET NAMES utf8等,但仍然无法完成。

那么如何告诉/强制server1 MySQL将latin1字符作为utf8处理并正确显示和转储?

1 个答案:

答案 0 :(得分:1)

在两台服务器上执行十六进制转储(即:SELECT HEX(columnname) FROM table)并查看数据是否相同。如果是,那么你就会知道至少数据没有被破坏。

在这种情况下,您只需要为服务器设置正确的字符集和排序规则。如果没有,您可能不得不重新进行数据传输,这一次确保设置正确。

另一件事是确保浏览器的编码设置为utf-8。

编辑:因此,数据在传输中被破坏了。 C3A7C593E280B9看的UTF-8表示形式。这可能是因为server1将数据发送为latin1,而server2将数据编码为UTF-8。

您必须在传输数据之前更改server1上的连接设置。为此,请运行以下查询:

SET CHARACTER SET utf8; SET NAMES utf8

然后再次尝试数据传输。

编辑2:根据你的说法,这就是我认为正在发生的事情。数据库中的数据以UTF-8编码。当PHP(Wordpress)获取这些数据时,它“认为”它在latin1(ISO-8859-1)中编码,这是(不幸的)PHP默认使用的。 PHP继续将这些数据提供给用户的浏览器,就好像它是用latin1编码一样,但是将字符编码设置为UTF-8,用户看到了他应该看到的内容。

简而言之,这是两个错误的例子。您现在有两个选择:

  1. 修复数据。 (即:将其读作UTF-8并将其写回latin1)

  2. 将server2的连接设置设置为与server1相同,这将导致数据仍然正确显示