Сегодня я преобразовал свою базу данных 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%';
в php в браузере, каждый вывод будет правильным utf8mb4
/utf8mb4_unicode_ci
(кроме character_set_system
, который просто utf8
, но я думаю, что это нормально?)
Что еще это может быть?