Cómo hacer que MySQL maneje UTF-8 correctamente
Una de las respuestas a una pregunta que hice ayer sugirió que debería asegurarme de que mi base de datos pueda manejar caracteres UTF-8 correctamente. ¿Cómo puedo hacer esto con MySQL?
Actualizar:
Respuesta corta: casi siempre debería utilizar el utf8mb4
juego de caracteres y utf8mb4_unicode_ci
la intercalación.
Para alterar la base de datos:
ALTER DATABASE dbname CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Ver:
Comentario de Aaron sobre esta respuesta Cómo hacer que MySQL maneje UTF-8 correctamente
¿Cuál es la diferencia entre utf8_general_ci y utf8_unicode_ci?
Guía de conversión: https://dev.mysql.com/doc/refman/5.5/en/charset-unicode-conversion.html
Respuesta original:
MySQL 4.1 y superiores tienen un juego de caracteres predeterminado de UTF-8. Puede verificar esto en su my.cnf
archivo, recuerde configurar tanto el cliente como el servidor ( default-character-set
y character-set-server
).
Si tiene datos existentes que desea convertir a UTF-8, descargue su base de datos e impórtela nuevamente como UTF-8 asegurándose de:
- utilizar
SET NAMES utf8
antes de consultar/insertar en la base de datos - utilizar
DEFAULT CHARSET=utf8
al crear nuevas tablas - En este punto, su cliente y servidor MySQL deberían estar en UTF-8 (consulte
my.cnf
). Recuerde que cualquier lenguaje que utilice (como PHP) también debe ser UTF-8. Algunas versiones de PHP utilizarán su propia biblioteca cliente MySQL, que puede no ser compatible con UTF-8.
Si desea migrar datos existentes, recuerde hacer una copia de seguridad primero. ¡Pueden ocurrir muchas modificaciones extrañas de datos cuando las cosas no salen según lo planeado!
Algunos recursos:
- completar la migración UTF-8 (cdbaby.com)
- artículo sobre la preparación para UTF-8 de las funciones php (tenga en cuenta que parte de esta información está desactualizada)
Para hacer esto "permanente", en my.cnf
:
[client]
default-character-set=utf8
[mysqld]
character-set-server = utf8
Para comprobarlo, vaya al cliente y muestre algunas variables:
SHOW VARIABLES LIKE 'character_set%';
Verifique que sean todos utf8
, excepto ..._filesystem
, que debería ser binary
y ..._dir
, que apuntan a algún lugar de la instalación de MySQL.
MySQL 4.1 y superiores tienen un juego de caracteres predeterminado al que llama utf8
, pero que en realidad es sólo un subconjunto de UTF-8 (permite sólo caracteres de tres bytes o menos).
Úselo utf8mb4
como juego de caracteres si desea UTF-8 "completo".