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 早于普遍使用。
快速升级,一切正常。
我今天将 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 早于普遍使用。
快速升级,一切正常。