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.