Сайт PHP/mysql, использующий utf8mb4, не будет правильно извлекать смайлики из базы данных, несмотря на то, что utf8mb4 указан везде, где я могу его найти

Сегодня я преобразовал свою базу данных 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, но я думаю, что это нормально?)

Что еще это может быть?


person Codemonkey    schedule 11.10.2016    source источник


Ответы (1)


Проблема была в устаревшей версии Navicat. Обновление с 8 до 11 решило мои проблемы. Я понял, что это, вероятно, было причиной, когда обнаружил, что смайлики, вставленные через php, правильно сохраняются и извлекаются в PHP, но не отображаются правильно в Navicat.

Точно так же верно и обратное; смайлики, установленные в Navicat, будут правильно храниться и извлекаться в Navicat, но не в PHP.

Глядя на параметры кодирования для соединений navicat, у него был флажок «использовать кодировку mysql», но если его не отметить, раскрывающийся список возможных параметров включал только utf8, а не utf8mb4. Я предполагаю, что navicat 8 предшествует тому, что широко используется.

Быстрое обновление, и все работает отлично.

person Codemonkey    schedule 12.10.2016
comment
Спасибо. Я добавил это в свой длинный список проблем с набором символов, связанных со сторонним программным обеспечением. - person Rick James; 19.10.2016