Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP的MySQL数据库迁移UTF-8问题_Php_Mysql_Utf 8_Utf8mb4 - Fatal编程技术网

PHP的MySQL数据库迁移UTF-8问题

PHP的MySQL数据库迁移UTF-8问题,php,mysql,utf-8,utf8mb4,Php,Mysql,Utf 8,Utf8mb4,我正在将现有数据库迁移到另一台服务器。为了实现这一点,我使用phpMyAdminSQL查询导出和导入了数据库。一切正常,除了一些UTF-8字符出现在网站上。我使用相同的PHP代码获取它们(在不同的服务器上,但具有相同的PHP扩展和版本) 我在新网站和数据库(新旧)上看到的字符串示例(使用phpMyAdmin):péri prothétique 我在旧网站péri prothétique 正如您所看到的,PHP用于以正确的方式自动编码字符,即使字符在数据库中被损坏,但不再这样做(即使我显式地u

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

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

我在旧网站
péri prothétique

正如您所看到的,PHP用于以正确的方式自动编码字符,即使字符在数据库中被损坏,但不再这样做(即使我显式地
utf8\u编码
utf8\u解码
结果)。我甚至尝试在每个连接上强制使用
$mysqli->set\u字符集(“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\u swedish\u ci
,而表格排序规则是
utf8\u general\u ci

这并不能回答人们所想的问题,因为旧网站正在自动“翻译”那些被破坏的字符,将它们呈现在HTML中,我想将这种行为复制到新网站中,新网站是一个不同的网站,但具有相同的代码和php.ini设置

我认为您应该检查您的配置

首先检查您的php代码,以了解是否存在误导性的打字错误(但我认为不会)

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

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

然后重新启动服务器:

mysql.server restart
希望它能帮你解决你的问题,兄弟


再见

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

要检查双重编码,请使用
选择十六进制(col).
应返回
C3A9
(正确的utf8),但应显示
C383C2A9
(双重编码)

见:

如果您已经确定您有双重编码,那么修复涉及

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


是的,“双重编码”是一个无声的错误——两个错误构成一个正确(某种程度上)。

不要使用ISO编码数据的
utf8\u编码
/
utf8\u解码
。除此之外,代码是完全相同的吗?如果在PHP交互之前查询两个DBs,数据是否相同?是的,使用phpMyAdmin的查询返回相同的数据。我试着解码/编码只是为了看看是否会发生什么,没有真正的预期。MARIADB 10.0.32比5.6.39稍早一点,但在这个问题上它们应该是“相同的”。感谢您的快速响应!我修改了MariaDB文件配置(从utf8到utf8mb4),但无法从ssh重新启动MariaDB服务器(无法识别“service”命令)。我将尝试重新启动机器,希望它能工作。我担心它不能工作:(我已经确定第一点和第二点不是问题所在(关于第二点,表格使用utf8,而不是utf8mb4,但旧的表格也使用utf8mb4)嗯..那太糟糕了!我想你应该搜索一下你的配置文件或类似的东西..SQL如何使用特殊编码字符插入数据?它工作正常吗?将数据库排序规则更改为utf8后(这显然与表排序规则相冲突,排序规则不应该是层叠的吗?通过双重编码创建那些损坏的字符)在数据库中插入大量utf8兼容的记录。问题是旧数据库中有那些讨厌的字符,但PHP会自动“翻译”它们是utf8兼容的,我的问题仍然是:为什么它不再这样做了?
显示像“char%”这样的变量;
并且你需要_客户端、_连接和_结果。你指的是什么?我没有对数据做任何更改,只是通过SQL查询从旧数据库复制/粘贴删除新服务器数据库中的所有数据并从旧服务器数据库备份中恢复。当然,我已经多次这样做了,但问题仍然存在。你不能从终端恢复吗?看来PHPMyAdmin没有使用UTF-8连接。我不认为PHPMyAdmin是罪魁祸首。如果你仔细阅读我的问题(我重新编写了它以使其更清楚一点)进入两个数据库的数据是相同的(都有损坏的双编码字符)。问题似乎是,
SELECT
结果在连接或PHP端都不会自动正确解码。谢谢,我已经看到了你的链接答案,它帮助我了解了导致此问题的原因。但是,我正在重新使用你提出的修复方案,因为它转换了pr
mysql.server restart
UPDATE tbl SET col = CONVERT(BINARY(CONVERT(col USING latin1)) USING utf8mb4);