PHP/mysql 使用 utf8mb4 的网站无法从数据库中正确检索表情符号,尽管在我能找到的所有地方都指定了 utf8mb4

PHP/mysql site using utf8mb4 won't retrieve emojis correctly from database, despite utf8mb4 being specified everywhere that I can find to put it

我今天将 mysql 5.7 数据库转换为 utf8mb4。

作为测试,我使用 Navicat 在字段中放置了一个便便表情符号 ()。

它在 Navicat 中显示正常,即使我退出并重新打开程序。

当我在我的脚本中使用 PDO 检索它并将它回显到浏览器时,问题就来了;我得到了������(6个对角线黑色问号)。

如果我将角色直接复制到我的脚本中并回显它,就可以了。

所以mysql没有问题。

不是字体问题

不是我浏览器的问题。

php回显不是问题。

所以...这是 PDO 的问题?

这是我的 PDO 代码:

$PDO = new PDO('mysql:host='.DB_SERVER.';dbname='.DB_NAME.';charset=utf8mb4', DB_USER, DB_PASSWORD, [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES   => false
]);
$PDO->query("SET NAMES 'utf8mb4' COLLATE 'utf8mb4_unicode_ci'");

$rs = $PDO->query("SELECT name FROM users WHERE id = 1000");  // name has been set to 

while ($a = $rs->fetch()) {
    print_r($a);
}

如果我在浏览器中检查 SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%'; in php 的输出,每个输出都是正确的 utf8mb4/utf8mb4_unicode_ci(除了 character_set_system只是 utf8,但我认为这很正常?)

还能是什么?

问题是 Navicat 版本过时。从 8 升级到 11 解决了我的问题。当我发现通过 php 插入的表情符号在 PHP 中正确存储和检索但在 Navicat 中无法正确显示时,我意识到这可能是原因。

同样情况正好相反;在 Navicat 中设置的表情符号可以在 Navicat 中正确存储和检索,但不能在 PHP.

查看 navicat 连接的编码选项,它有一个 "use mysql encoding" 的复选框,但如果未选中,可能选项的下拉列表仅包含 utf8,而不是 utf8mb4。我猜 navicat 8 早于普遍使用。

快速升级,一切正常。