我正在将现有数据库迁移到另一台服务器。为了实现这一点,我使用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设置。
3条答案
按热度按时间dm7nw8vv1#
要检查双重编码,请使用
SELECT HEX(col)...
é
你应该回来C3A9
(正确的utf8),但显示C383C2A9
(双重编码)。请参阅:utf-8字符故障;我看到的不是我储存的
如果您已经确定您有双重编码,那么修复涉及
看到了吗http://mysql.rjweb.org/doc.php/charcoll#fixes_for_various_cases
是的,“双重编码”是一个无声的错误——两个错误代表一个正确(有点)。
dzhpxtsq2#
我认为你应该检查一下你的配置。
首先检查你的php代码,以知道是否有误导性的打字错误(但我认为它没有)
其次,检查mariadb数据库/表结构[从这里提取]:
第三,检查mariadb文件config(my.cnf)[从这里提取]:
然后重新启动服务器:
希望它能帮你解决你的问题,兄弟。
再见
xxslljrj3#
您是否希望对现有数据进行更改?这是行不通的。您需要再次添加数据以查看更改。从新数据库中删除所有数据,然后再次添加。