首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >MySQL数据库迁移UTF-8问题

MySQL数据库迁移UTF-8问题
EN

Stack Overflow用户
提问于 2018-06-12 22:23:22
回答 3查看 1.2K关注 0票数 0

我正在将现有的数据库迁移到另一台服务器上。为此,我使用phpMyAdmin SQL查询导出和导入了数据库。一切正常,除了一些UTF-8字符在网站中显示为损坏。我使用相同的PHP代码(在不同的服务器上,但具有相同的PHP扩展和版本)获取它们。

我在新网站和数据库(旧的和新的)上看到的字符串示例(使用phpMyAdmin):péri-prothétique

我在旧网站péri-prothétique中看到的字符串示例

正如您所看到的,即使字符在数据库中已损坏,PHP也会自动以正确的方式对字符进行编码,但现在不再这样做了(即使我显式地对结果执行utf8_encodeutf8_decode )。我甚至尝试在每个连接上强制$mysqli->set_charset("UTF8"),但都无济于事。

web服务器、数据库服务器、服务器连接、PHP和表都使用UTF-8或utf8mb4字符集和排序规则,并且设置方式与旧的相同。

我看到的唯一区别是新的数据库服务器是MariaDB而不是MySQL,它的new服务器是nginx而不是Apache。

来自phpMyAdmin的新数据库规格图片:

旧数据库规格图片:

运行网站和PHP的新New服务器规格(与旧规格相同,但不同的服务器):Apache2.4 PHP 7.0

我怎样才能恢复旧的正确编码呢?为什么PHP不再自动正确地解码它们?

更新:使用我发现新旧版本的mb_detect_encoding都会在查询结果上检测ASCII码或UTF8,这取决于是否至少有一个UTF8符号。问题是,在新版本中,PHP不能正确显示UTF-8符号,即使它检测到字符串编码为UTF-8。

更新2:多亏了this question,我找出了我的条目被破坏的原因:产生了双重编码,因为数据库排序规则是latin1_swedish_ci,而表排序规则是utf8_general_ci。这并没有回答我所认为的问题,因为旧网站会自动“翻译”这些乱码字符,并在超文本标记语言中呈现它们,我想将这种行为复制到新网站中,它是一个不同的网站,但具有相同的代码和php.ini设置。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-06-14 01:34:54

要检查双重编码,请使用SELECT HEX(col)... é C3A9 (正确的utf8),而不是显示C383C2A9 (双重编码)。

请参阅:Trouble with UTF-8 characters; what I see is not what I stored

如果您确实确定使用了双重编码,则修复方法包括

代码语言:javascript
复制
UPDATE tbl SET col = CONVERT(BINARY(CONVERT(col USING latin1)) USING utf8mb4);

请参阅http://mysql.rjweb.org/doc.php/charcoll#fixes_for_various_cases

是的,“双重编码”是一个无声的bug --两个错误就是一个正确(某种意义上)。

票数 0
EN

Stack Overflow用户

发布于 2018-06-12 22:36:29

我认为你应该检查一下你的MariaDB配置。

首先检查你的php代码,以确定是否有误导性的拼写错误(但我认为没有)

其次,检查您的MariaDB数据库/表结构[extracted from here ]:

代码语言:javascript
复制
SELECT * FROM INFORMATION_SCHEMA.SCHEMATA;

第三,检查您的MariaDB文件配置(my.cnf)[extracted from here ]:

代码语言:javascript
复制
    [client]
default-character-set = utf8mb4

[mysqld]
character-set-server = utf8mb4

然后重新启动您的服务器:

代码语言:javascript
复制
mysql.server restart

希望它能帮助你解决你的问题,兄弟。

再见

票数 0
EN

Stack Overflow用户

发布于 2018-06-13 18:54:05

您是否期望对现有数据进行更改?这是行不通的。您需要再次添加数据才能看到更改。从新数据库中删除所有数据,然后重新添加。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50819527

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档