8问题

igetnqfo  于 2021-06-21  发布在  Mysql
关注(0)|答案(3)|浏览(258)

我正在将现有数据库迁移到另一台服务器。为了实现这一点,我使用phpMyAdminSQL查询导出和导入了数据库。一切正常,除了一些utf-8字符出现在网站上。我使用相同的php代码(在不同的服务器上,但使用相同的php扩展和版本)获取它们。
在新网站和数据库(新旧数据库)上看到的字符串示例(使用phpmyadmin): péri-prothétique 我在旧网站上看到的字符串示例 péri-prothétique 如您所见,php曾经以正确的方式自动编码字符,甚至认为字符在数据库中已损坏,但现在不再这样做了(即使我显式地 utf8_encode 或者 utf8_decode 结果)。我甚至试过强迫 $mysqli->set_charset("UTF8") 在每个连接上都没有用。
web服务器、数据库服务器、服务器连接、php和表都使用utf-8或utf8mb4字符集和排序规则,设置方式与旧的相同。
我看到的唯一区别是新的数据库服务器是mariadb而不是mysql,它的web服务器是nginx而不是apache。
phpmyadmin中的新数据库规格图片:

旧数据库规格图片:

运行网站和php的新Web服务器规范(与旧规范相同,但服务器不同):Apache2.4PHP7.0
我怎样才能找回原来正确的编码?为什么php不再自动正确解码它们?
更新:使用 mb_detect_encoding 我看到新旧版本的php都会在查询结果上检测ascii或utf-8,这取决于是否至少有utf-8符号。问题是,在新版本中,php即使检测到字符串编码为utf-8,也无法正确显示utf-8符号。
更新2:由于这个问题,我弄明白了我的条目被损坏的原因:双重编码是因为数据库排序规则是错误的 latin1_swedish_ci 而表格排序规则 utf8_general_ci . 这并不能回答我们所想的问题,因为旧网站正在自动“翻译”那些损坏的字符,将它们呈现在html中,我想将这种行为复制到新网站上,新网站是一个不同的网站,但具有相同的代码和php.ini设置。

dm7nw8vv

dm7nw8vv1#

要检查双重编码,请使用
SELECT HEX(col)... é 你应该回来 C3A9 (正确的utf8),但显示 C383C2A9 (双重编码)。
请参阅:utf-8字符故障;我看到的不是我储存的
如果您已经确定您有双重编码,那么修复涉及

UPDATE tbl SET col = CONVERT(BINARY(CONVERT(col USING latin1)) USING utf8mb4);

看到了吗http://mysql.rjweb.org/doc.php/charcoll#fixes_for_various_cases
是的,“双重编码”是一个无声的错误——两个错误代表一个正确(有点)。

dzhpxtsq

dzhpxtsq2#

我认为你应该检查一下你的配置。
首先检查你的php代码,以知道是否有误导性的打字错误(但我认为它没有)
其次,检查mariadb数据库/表结构[从这里提取]:

SELECT * FROM INFORMATION_SCHEMA.SCHEMATA;

第三,检查mariadb文件config(my.cnf)[从这里提取]:

[client]
default-character-set = utf8mb4

[mysqld]
character-set-server = utf8mb4

然后重新启动服务器:

mysql.server restart

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

xxslljrj

xxslljrj3#

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

相关问题