将数据从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处理并正确显示和转储?
答案 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,用户看到了他应该看到的内容。
简而言之,这是两个错误的例子。您现在有两个选择:
修复数据。 (即:将其读作UTF-8并将其写回latin1)
将server2的连接设置设置为与server1相同,这将导致数据仍然正确显示。