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?
102
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?
CHARACTER SETs
; 5.1.24 interfirió con la intercalación de la aguda-s alemana (ß), que se rectificó al agregar otra intercalación en 5.1.62 (posiblemente empeorando las cosas); 5.5.3 completó utf8 con el nuevo juego de caracteres utf8mb4.utf8
. Solo admite caracteres de hasta 3 bytes. El conjunto de caracteres correcto que debe usar en MySQL esutf8mb4
.Respuestas:
Actualizar:
Respuesta corta: casi siempre debería utilizar el
utf8mb4
juego de caracteres y lautf8mb4_unicode_ci
intercalación.Para alterar la base de datos:
Ver:
El 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 superior tiene 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
ycharacter-set-server
).Si tiene datos existentes que desea convertir a UTF-8, descargue su base de datos e impórtela de nuevo como UTF-8 asegurándose de:
SET NAMES utf8
antes de consultar / insertar en la base de datosDEFAULT CHARSET=utf8
al crear nuevas tablasmy.cnf
). recuerde que cualquier idioma que utilice (como PHP) también debe ser UTF-8. Algunas versiones de PHP usará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. ¡Se pueden producir muchos cortes extraños de datos cuando las cosas no salen según lo planeado!
Algunos recursos:
fuente
utf8
dentro de MySQL solo se refiere a un pequeño subconjunto de Unicode completo. Debería utilizarutf8mb4
en su lugar para forzar el apoyo total. Consulte mathiasbynens.be/notes/mysql-utf8mb4 "Durante mucho tiempo, usé el juego de caracteres utf8 de MySQL para bases de datos, tablas y columnas, asumiendo que se asignaba a la codificación UTF-8 descrita anteriormente".latin1
ylatin1_swedish_ci
para el juego de caracteres y colación predeterminados. Consulte la página "Colación y conjunto de caracteres del servidor" en el manual de MySQL para confirmarlo: dev.mysql.com/doc/refman/5.1/en/charset-server.htmlutf8mb4
tener espacio de almacenamiento adicional cuando la mayoría del texto es ASCII. Aunque laschar
cadenas están preasignadas, lasvarchar
cadenas no lo están; consulte las últimas líneas en esta página de documentación . Por ejemplo,char(10)
se reservará pesimistamente 40 bytes bajo utf8mb4, perovarchar(10)
asignará bytes de acuerdo con la codificación de longitud variable.varchar(n)
eltext
tipo de datos si intenta modificar unvarchar(n)
campo a un tamaño de byte mayor que el factible (mientras emite una advertencia). Un índice también tendrá un límite superior inferior en el peor de los casos, y eso puede presentar otros problemas.Para hacer esto 'permanente', en
my.cnf
:Para comprobarlo, vaya al cliente y muestre algunas variables:
Verifique que estén todos
utf8
, excepto..._filesystem
, que debería serbinary
y..._dir
, que apunta en algún lugar de la instalación de MySQL.fuente
create table my_name(field_name varchar(25) character set utf8);
utf8
no es UTF-8 "completo".MySQL 4.1 y superior tiene un juego de caracteres predeterminado al que llama,
utf8
pero que en realidad es solo un subconjunto de UTF-8 (permite solo caracteres de tres bytes y más pequeños).Úselo
utf8mb4
como su juego de caracteres si desea UTF-8 "completo".fuente
utf8
no incluye caracteres como emoticonos.utf8mb4
hace. Consulte esto para obtener más información sobre cómo actualizar: mathiasbynens.be/notes/mysql-utf8mb4La respuesta corta: Úselo
utf8mb4
en 4 lugares:SET NAMES utf8mb4
o algo equivalente al establecer la conexión del cliente a MySQLCHARACTER SET utf8mb4
en todas las tablas / columnas, excepto las columnas que son estrictamente ascii / hex / country_code / zip_code / etc.<meta charset charset=UTF-8>
si está enviando a HTML. (Sí, la ortografía es diferente aquí).Más info ;
UTF8 hasta el final
Los enlaces anteriores proporcionan la "respuesta canónica detallada se requiere para abordar todas las preocupaciones". - Hay un límite de espacio en este foro.
Editar
Además de
CHARACTER SET utf8mb4
contener "todos" los personajes del mundo,COLLATION utf8mb4_unicode_520_ci
es discutible la colación "mejor completa" que se puede utilizar. (También hay colaciones de turco, español, etc. para aquellos que quieren los matices en esos idiomas).fuente
El juego de caracteres es una propiedad de la base de datos (predeterminado) y la tabla. Puedes echar un vistazo (comandos de MySQL):
En otras palabras; es bastante fácil verificar el conjunto de caracteres de su base de datos o cambiarlo:
fuente
utf8
no es UTF-8 "completo".Para cambiar la codificación del juego de caracteres a UTF-8 para la propia base de datos, escriba el siguiente comando en el indicador mysql>. USE
ALTER DATABASE
.. Reemplace DBNAME con el nombre de la base de datos:Este es un duplicado de esta pregunta ¿Cómo convertir un conjunto de caracteres y una colación de una base de datos MySQL completa a UTF-8?
fuente
Seguí la solución de Javier, pero agregué algunas líneas diferentes en my.cnf:
Encontré esta idea aquí: http://dev.mysql.com/doc/refman/5.0/en/charset-server.html en el primer / único comentario del usuario en la parte inferior de la página. Menciona que saltar-juego-de-caracteres-cliente-apretón de manos tiene cierta importancia.
fuente
skip-character-set-client-handshake
fue la clave.Estos consejos sobre MySQL y UTF-8 pueden resultar útiles. Desafortunadamente, no constituyen una solución completa, solo problemas comunes.
fuente
Configure su
database collation
paraUTF-8
luego aplicartable collation
a la base de datos predeterminada.fuente
Su respuesta es que puede configurar mediante MySql Settings. En My Answer puede haber algo fuera de contexto, pero esto también es una ayuda para ti.
cómo configurar
Character Set
yCollation
.utf8
, mientras que las aplicaciones que usan otra base de datos pueden requerir sjis.Los ejemplos que se muestran aquí para su pregunta para establecer el conjunto de caracteres utf8, aquí también establecen la intercalación para más útil (
utf8_general_ci
intercalación`).Especificar la configuración de caracteres por base de datos
Especificar la configuración de caracteres al iniciar el servidor
Especificar la configuración de caracteres en el momento de la configuración de MySQL
Para ver los valores del conjunto de caracteres y las variables del sistema de clasificación que se aplican a su conexión, utilice estas declaraciones:
Esta puede ser una respuesta larga, pero puede usarla. Espero que mi respuesta te sea útil. para obtener más información http://dev.mysql.com/doc/refman/5.7/en/charset-applications.html
fuente
SET NAMES UTF8
Este es el truco
fuente
SET NAMES UTF8
(oUTF8mb4
) es correcto, no explica qué hace (juego de caracteres utilizado para esta conexión). "Esto hace el truco" parece que resolvería el problema (hacer que MySQL maneje UTF-8 correctamente), pero muchas bases de datos MySQL están configuradas en latin1 por defecto, por lo que eso no lo convertiría en una solución adecuada. Me gustaría cambiar el juego de caracteres por defecto y los juegos de caracteres de la tabla a utf8mb4. Realmente, esta respuesta es bastante incompleta, así que la rechacé.CONEXIÓN DE LA BASE DE DATOS A UTF-8
fuente
Establezca su conexión de base de datos en UTF8:
fuente
mysql_*
interfaz obsoleta . Cambiar amysqli_*
oPDO
.Pude encontrar una solución. Ejecutó lo siguiente como se especifica en http://technoguider.com/2015/05/utf8-set-up-in-mysql/
fuente
CHARACTER SET utf8
.root
no ejecutará lo más importanteinit_connect
.