utf8
de MySQL la codificación es no UTF-8 real. Es una codificación que es un poco como UTF-8, pero solo admite un subconjunto de lo que admite UTF-8. utf8mb4
es real UTF-8. Esta diferencia es un detalle de implementación interna de MySQL. Ambos se ven como UTF-8 en el lado de PHP. Si usa utf8
o utf8mb4
, PHP obtendrá UTF-8 válido en ambos casos.
Lo que debe asegurarse es que la codificación de conexión entre PHP y MySQL se establece en utf8mb4
. Si está configurado en utf8
, MySQL no admitirá todos los caracteres. Configura esta codificación de conexión usando mysql_set_charset()
, el PDO charset
Parámetro de conexión DSN o cualquier otro método que sea apropiado para la API de base de datos que elija.
mb_internal_encoding
simplemente establece el valor predeterminado para $encoding
parámetro todo mb_*
funciones tienen. No tiene nada que ver con MySQL.
UTF-8 y UTF-32 difieren en la forma en que codifican los caracteres. UTF-8 usa un mínimo de 1 byte por carácter y un máximo de 4. UTF-32 siempre utiliza 4 bytes para cada carácter. UTF-16 usa un mínimo de 2 bytes y un máximo de 4.
Debido a su longitud variable, UTF-8 tiene un poco de sobrecarga. Un carácter que se puede codificar en 2 bytes en UTF-16 puede tomar 3 o 4 en UTF-8; por otro lado, UTF-16 nunca usa menos de 2 bytes. Si está almacenando mucho texto asiático, UTF-16 puede usar menos almacenamiento. Si la mayor parte de su texto es inglés/ASCII, UTF-8 usa menos almacenamiento. UTF-32 siempre usa la mayor cantidad de almacenamiento.