2016-10-11 2 views
0

J'ai converti ma base de données mysql 5.7 en utf8mb4 aujourd'hui.Le site PHP/mysql utilisant utf8mb4 ne récupérera pas correctement les emojis de la base de données, bien que utf8mb4 soit spécifié partout où je peux trouver

Comme test, j'ai mis un emoji() dans un champ, en utilisant Navicat.

Il s'affiche très bien dans Navicat, même si je quitte et rouvre le programme.

Le problème vient quand je le récupère en utilisant PDO dans mon script et que je le renvoie au navigateur; Je reçois (6 questions noires en diagonale).

Si je copie le caractère directement dans mon script et l'écho, cela fonctionne.

Donc, ce n'est pas un problème avec mysql.

Ce n'est pas un problème avec la police.

Ce n'est pas un problème avec mon navigateur.

Ce n'est pas un problème avec l'écho php.

Alors ... c'est un problème avec PDO?

Ceci est mon code AOP:

$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); 
} 

Si je vérifie la sortie de SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%'; en php dans le navigateur chaque sortie est correctement utf8mb4/utf8mb4_unicode_ci (en dehors de character_set_system qui est tout simplement utf8, mais je pense que c'est normal ?)

Quoi d'autre pourrait-il être?

Répondre

0

Le problème était une version obsolète de Navicat. Mise à niveau de 8 à 11 a résolu mes problèmes. J'ai réalisé que c'était probablement la cause quand j'ai découvert que les emojis INSERT via php étaient correctement stockés et récupérés en PHP, mais ne s'afficheraient pas correctement dans Navicat.

De même, le contraire était vrai; emojis défini dans Navicat serait correctement stocké et récupéré dans Navicat, mais pas en PHP. En regardant les options de codage pour les connexions navicat, il y avait une case à cocher pour "utiliser l'encodage mysql", mais si elle n'était pas cochée, la liste déroulante des options possibles incluait seulement utf8, pas utf8mb4. Je suppose que navicat 8 est antérieur à l'usage courant.

Une mise à jour rapide, et tout fonctionne parfaitement.

+0

Merci. J'ai ajouté cela à ma [longue liste de questions charset] (http://mysql.rjweb.org/doc.php/charcoll#other_computer_languages) avec un logiciel tiers. –