working utf8 not mysqli_set_charset mysql_query charset php mysql

not - Usando utf8mb4 con php y mysql



set utf8 php (4)

Antes de ejecutar su consulta real, haga un mysql_query (''SET NAMES utf8mb4'')

Asegúrese también de que su servidor mysql esté configurado para usar utf8mb4 también. Para obtener más información sobre cómo, consulte el artículo: https://mathiasbynens.be/notes/mysql-utf8mb4#utf8-to-utf8mb4

He leído que mysql> = 5.5.3 admite todos los caracteres posibles si UTILIZA la codificación utf8mb4 para una tabla / columna determinada http://mathiasbynens.be/notes/mysql-utf8mb4

se ve bien. Sólo me di cuenta de que las funciones mb en php no! No puedo encontrarlo en ninguna parte de la lista: http://php.net/manual/en/mbstring.supported-encodings.php

No solo he leído cosas sino que también hice una prueba.

He añadido datos a una tabla mysql utf8mb4 utilizando un script php donde la codificación interna se estableció en UTF-8: mb_internal_encoding("UTF-8");

y, como se esperaba, los personajes se ven desordenados una vez en la db.

¿Alguna idea de cómo puedo hacer que php y mysql hablen con la misma codificación (posiblemente de 4 bytes uno) y aún tenga soporte completo para cualquier idioma del mundo?

Además, ¿por qué es utf8mb4 diferente de utf32?


Esto es lo que usé, y funcionó bien para mi problema con el euro euro sign y la conversión para el fallo de json_encode.

Guión de configuraciones php (api etc.)

header(''Content-Type: text/html; charset=utf-8''); ini_set("default_charset", "UTF-8"); mb_internal_encoding("UTF-8"); iconv_set_encoding("internal_encoding", "UTF-8"); iconv_set_encoding("output_encoding", "UTF-8");

tablas mysql / o columnas especificas

utf8mb4

conexión PDO mysql

$dsn = ''mysql:host=yourip;dbname=XYZ;charset=utf8mb4'';

(...su conexión ...)

antes de ejecutar la consulta (podría no ser necesario):

$dbh->exec("set names utf8mb4");


La codificación utf8 de MySQL no es UTF-8 real. Es una codificación que es algo así como UTF-8, pero solo admite un subconjunto de lo que UTF-8 admite. 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. Ya sea que use utf8 o utf8mb4 , PHP obtendrá UTF-8 válido en ambos casos.

Lo que debe asegurarse es que la codificación de la conexión entre PHP y MySQL esté configurada en utf8mb4 . Si está configurado en utf8 , MySQL no admitirá todos los caracteres. Configure esta codificación de conexión utilizando mysql_set_charset() , el parámetro de conexión DSN del mysql_set_charset() charset PDO 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 el parámetro $encoding que tienen todas las funciones mb_* . No tiene nada que ver con MySQL.

UTF-8 y UTF-32 difieren en cómo codifican los caracteres. UTF-8 usa un mínimo de 1 byte para un carácter y un máximo de 4. UTF-32 siempre usa 4 bytes para cada carácter. UTF-16 utiliza 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 puede codificarse 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 muchos textos asiáticos, es posible que UTF-16 use menos almacenamiento. Si la mayor parte de su texto es inglés / ASCII, UTF-8 usa menos almacenamiento. UTF-32 siempre utiliza la mayoría de almacenamiento.


  • utf-32: esta es una codificación de caracteres que utiliza un fijo de 4 bytes por caracteres
  • utf-8: esta es una codificación de caracteres que usa hasta 4 bytes por caracteres, pero los caracteres más frecuentes están codificados en solo 1, 2 o 3 caracteres.

El utf-8 de MySQL no admite caracteres codificados en más de 3 caracteres, por lo que agregaron utf-8mb4, que es realmente utf-8.