utf8
de MySQL l'encodage n'est pas UTF-8 réel. C'est un encodage qui ressemble un peu à UTF-8, mais qui ne prend en charge qu'un sous-ensemble de ce que UTF-8 prend en charge. utf8mb4
est réel UTF-8. Cette différence est un détail d'implémentation interne de MySQL. Les deux ressemblent à UTF-8 du côté PHP. Que vous utilisiez utf8
ou utf8mb4
, PHP obtiendra un UTF-8 valide dans les deux cas.
Ce dont vous devez vous assurer, c'est que l'encodage de connexion entre PHP et MySQL est défini sur utf8mb4
. S'il est défini sur utf8
, MySQL ne prend pas en charge tous les caractères. Vous définissez cet encodage de connexion en utilisant mysql_set_charset()
, le charset
du PDO Paramètre de connexion DSN ou toute autre méthode appropriée pour l'API de base de données de votre choix.
mb_internal_encoding
définit simplement la valeur par défaut pour le $encoding
paramètre tous mb_*
les fonctions ont. Cela n'a rien à voir avec MySQL.
UTF-8 et UTF-32 diffèrent dans la façon dont ils encodent les caractères. UTF-8 utilise un minimum de 1 octet pour un caractère et un maximum de 4. UTF-32 toujours utilise 4 octets pour chaque caractère. UTF-16 utilise un minimum de 2 octets et un maximum de 4.
En raison de sa longueur variable, UTF-8 a un peu de surcharge. Un caractère qui peut être encodé sur 2 octets en UTF-16 peut en prendre 3 ou 4 en UTF-8; d'autre part, UTF-16 n'utilise jamais moins plus de 2 octets. Si vous stockez beaucoup de texte asiatique, UTF-16 peut utiliser moins de stockage. Si la majeure partie de votre texte est en anglais/ASCII, UTF-8 utilise moins de stockage. UTF-32 utilise toujours le plus de stockage.