gpt4 book ai didi

mysql - 在具有不同字符集的两个 MySQL 之间迁移数据,搞砸了 utf8

转载 作者:行者123 更新时间:2023-11-29 01:00:57 25 4
gpt4 key购买 nike

将数据从 MySQL server1 迁移到 MySQL server2

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

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,用于使用 readline 6.0 的 pc-linux-gnu (x86_64)

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 中的每个东亚字符似乎都被弄乱了,无论是在控制台的 SELECT 查询中还是在 mysqldump 文件中。症状是,比如汉字变成了三个latin1字符看,结果是一样的SELECT _latin1'看'的UTF8表示是\xe7\x9c\x8b所以MySQL以某种方式直接将每个字节显示为单独的latin1字符而不是将3个字节呈现为汉字。

即使我使用 Navicat 8 中的“数据传输”功能将两个数据库从 server1 复制到 server2 相同,在 server2 上运行的新博客也会出现乱码。 SET NAMES utf8 等各种方法都试过了,还是不行。

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

最佳答案

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

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

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

编辑:所以,数据确实在传输过程中被破坏了。 C3A7C593E280B9看 的 UTF-8 表示。这可能是因为服务器 1 以 latin1 格式发送数据,而服务器 2 将其编码为 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. 将服务器 2 的连接设置设置为与服务器 1 相同,这将导致数据仍然正确显示

关于mysql - 在具有不同字符集的两个 MySQL 之间迁移数据,搞砸了 utf8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3274261/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com