Una de las respuestas a a question I asked yesterday sugirió que debería asegurarme de que mi base de datos pueda manejar correctamente los caracteres UTF-8. ¿Cómo puedo hacer esto con MySQL?Cómo hacer que MySQL maneje UTF-8 correctamente
Respuesta
MySQL 4.1 y superior tiene un juego de caracteres predeterminado de UTF-8. Puede verificar esto en su archivo my.cnf
, recuerde configurar cliente y servidor (default-character-set
y character-set-server
).
Si tiene datos que desea convertir a UTF-8 existente, un volcado de la base de datos, y la importación de nuevo como UTF-8 asegurarse de que:
- uso
SET NAMES utf8
antes de Consulta/insertar en la base de datos - uso
DEFAULT CHARSET=utf8
al crear nuevas tablas - en este punto de su cliente de MySQL y el servidor deben estar en UTF-8 (véase
my.cnf
). recuerde que cualquier idioma que use (como PHP) debe ser UTF-8 también. Algunas versiones de PHP usarán su propia biblioteca de cliente MySQL, que puede no ser compatible con UTF-8.
Si desea migrar los datos existentes, recuerde hacer una copia de seguridad primero. ¡Se pueden producir muchos cortes de datos extraños cuando las cosas no salen según lo planeado!
Algunos recursos:
- complete UTF-8 migration (cdbaby.com)
- artículo sobre UTF-8 readiness of php functions (tenga en cuenta alguna de esta información es obsoleta)
Según tengo entendido, 'utf8' dentro de MySQL solo se refiere a un pequeño subconjunto de Unicode completo. Debería usar 'utf8mb4' para forzar el soporte completo. Ver http://mathiasbynens.be/notes/mysql-utf8mb4 "Durante mucho tiempo, estaba usando el conjunto de caracteres utf8 de MySQL para bases de datos, tablas y columnas, * asumiendo que * se había mapeado a la codificación UTF-8 descrita anteriormente." –
MySQL nunca ha tenido un juego de caracteres predeterminado de UTF-8. 4.1 y 5.x hasta la última versión 5.7 todos usan 'latin1' y' latin1_swedish_ci' para el conjunto de caracteres predeterminado y la intercalación. Consulte la página "Conjunto de caracteres del servidor y compilación" en el manual de MySQL para su confirmación: https://dev.mysql.com/doc/refman/5.1/en/charset-server.html – Animism
* (¡El comentario de Tim ha desaparecido! Pero yo Creo que mi respuesta aquí podría ser útil para algunos. Aquí está:) * De acuerdo con [Wikipedia] (http://en.wikipedia.org/wiki/UTF-8) las codificaciones de 5 y 6 bytes han sido eliminadas . Nunca fueron realmente utilizados. Unicode nunca definió un rango de caracteres que usaban las codificaciones de 5 o 6 bytes. Creo que [este correo electrónico] (http://www.unicode.org/mail-arch/unicode-ml/Archives-Old/UML018/0330.html) lo explica mejor –
SET NAMES UTF8
Esto es hace el truco
Si bien el uso de 'SET NAMES UTF8' (o' UTF8mb4') es correcto, usted no explica qué hace (juego de caracteres utilizado para esta conexión). "Esto sí funciona" parece que resolvería el problema (hacer que MySQL maneje UTF-8 correctamente), pero muchas bases de datos MySQL están configuradas en latin1 de manera predeterminada, por lo que no sería una solución adecuada. Yo [cambiaría el juego de caracteres predeterminado] (http://stackoverflow.com/a/24487309/664132) y los juegos de caracteres de la tabla a utf8mb4. Realmente, esta respuesta es bastante incompleta, así que la rechacé. – basic6
Para hacer t su 'permanente', en my.cnf
:
[client]
default-character-set=utf8
[mysqld]
character-set-server = utf8
Para comprobarlo, vaya a la cliente y mostrar algunas variables:
SHOW VARIABLES LIKE 'character_set%';
Verificar que todos son utf8
, excepto ..._filesystem
, que debe ser binary
y ..._dir
, que apunta a alguna parte de la instalación de MySQL.
No funcionó en mi caso, pero creé el archivo my.cf en/etc con el contenido dado de todos modos. Utilicé 'create table my_name (field_name varchar (25) character set utf8);' –
The "SHOW VARIABLES LIKE 'character_set%';" comando me reveló el problema con mi conexión. ¡Gracias! – javsmo
Esto no es correcto. Lo que MySQL llama 'utf8' no es" completo "UTF-8. –
El juego de caracteres es una propiedad de la base de datos (por defecto) y la tabla. Puede echar un vistazo (comandos de MySQL):
show create database foo;
> CREATE DATABASE `foo`.`foo` /*!40100 DEFAULT CHARACTER SET latin1 */
show create table foo.bar;
> lots of stuff ending with
>) ENGINE=InnoDB AUTO_INCREMENT=252 DEFAULT CHARSET=latin1
En otras palabras; que es bastante fácil de comprobar su juego de caracteres base de datos o cambiarlo:
ALTER TABLE `foo`.`bar` CHARACTER SET utf8;
Esto no es correcto.Lo que MySQL llama 'utf8' no es" completo "UTF-8. –
Estos tips on MySQL and UTF-8 puede ser útil. Desafortunadamente, no constituyen una solución completa, solo problemas comunes.
Seguí la solución de Javier, pero agregué algunas líneas diferentes en mi.CNF:
[myslqd]
skip-character-set-client-handshake
collation_server=utf8_unicode_ci
character_set_server=utf8
me encontré con esta idea aquí: http://dev.mysql.com/doc/refman/5.0/en/charset-server.html en la primera único comentario/usuario en la parte inferior de la página. Menciona que skip-character-set-client-handshake tiene cierta importancia.
Establecer la conexión a la base de datos a UTF8:
if($handle = @mysql_connect(DB_HOST, DB_USER, DB_PASS)){
//set to utf8 encoding
mysql_set_charset('utf8',$handle);
}
Si ejecuta PHP, no use la interfaz obsoleta 'mysql_ *'. Cambia a 'mysqli_ *' o 'PDO'. –
MySQL 4.1 y tiene un conjunto de caracteres predeterminado que llama utf8
, pero que en realidad es sólo un subconjunto de UTF-8 (sólo permite caracteres de tres bytes y menor).
Use utf8mb4
como su juego de caracteres si desea "completo" UTF-8.
Lamentablemente, esta es la única respuesta correcta hasta el momento. – Basti
Definitivamente de acuerdo, esta es la única respuesta correcta. 'utf8' no incluye caracteres como emoticones. 'utf8mb4' hace. Verifique esto para obtener más información sobre cómo actualizar: https://mathiasbynens.be/notes/mysql-utf8mb4 – jibai31
@Basti - Mayormente correcto (latin1 fue el predeterminado hasta hace poco), y no completo (no se discute correctamente insertar/seleccionando datos codificados por utf8, ni exhibiendo en html). –
Pude encontrar una solución. Ran lo siguiente como se especifica en http://technoguider.com/2015/05/utf8-set-up-in-mysql/
SET NAMES UTF8;
set collation_server = utf8_general_ci;
set default-character-set = utf8;
set init_connect = ’SET NAMES utf8′;
set character_set_server = utf8;
set character_set_client = utf8;
Las dos últimas líneas son redundantes, ya que la primera ya incluye las siguientes: https://dev.mysql.com/doc/refman/5.0/en/charset-connection.html – DanielM
Además, no es una solución completa. Las columnas necesitan 'CHARACTER SET utf8'. 'root' no ejecutará el importantísimo' init_connect'. –
La respuesta corta: Uso utf8mb4
en 4 lugares:
- Los bytes de su cliente son UTF-8, no latin1/CP1251/etc.
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í)
Los enlaces de arriba proporcionan la "respuesta canónica detallada necesaria para abordar todas las inquietudes". - Hay un límite de espacio en este foro.
Editar
Además de CHARACTER SET utf8mb4
contiene caracteres "todo" el mundo, COLLATION utf8mb4_unicode_520_ci
es discutible el 'mejor all-around' cotejo de usar. (También hay colaciones turcas, españolas, etc. para aquellos que desean los matices en esos idiomas.)
Mi [_new link_] (http://stackoverflow.com/questions/38363566/trouble-with-utf8-characters-what-i-see-is-not-what-i-stored) sobre cómo solucionar problemas de utf8 desde la salida que obtienes –
Su respuesta es que puede configurarlo a través de la Configuración de MySql. En mi respuesta puede ser algo fuera de contexto, pero esto también es saber es de ayuda para usted.
cómo configurar Character Set
y Collation
.
Para aplicaciones que almacenan datos utilizando el default MySQL establece y cotejo (
latin1, latin1_swedish_ci
), no será necesario una configuración especial .Si las aplicaciones requieren el almacenamiento de datos utilizando un conjunto de caracteres distinto o reunión, puede configurar el conjunto de caracteres información varias maneras:
- Especificar configuración de caracteres por base de datos. Por ejemplo, las aplicaciones que usan una base de datos pueden requerir
utf8
, mientras que las aplicaciones que usan otra base de datos pueden requerir sjis. - Especifique la configuración de caracteres al inicio del servidor. Esto hace que el servidor use las configuraciones dadas para todas las aplicaciones que no hacen otras configuraciones .
- Especifique la configuración de caracteres en el momento de la configuración, si compila MySQL desde la fuente. Esto hace que el servidor use las configuraciones dadas para todas las aplicaciones , sin tener que especificarlas al inicio del servidor.
Los ejemplos que se muestran aquí para su pregunta para configurar el juego de caracteres UTF-8, aquí también establecen cotejo para más útiles (utf8_general_ci
collation`).
Especificar configuración de caracteres por base de datos
CREATE DATABASE new_db
DEFAULT CHARACTER SET utf8
DEFAULT COLLATE utf8_general_ci;
Especificar opciones de caracteres al arrancar el servidor
[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
Especificar opciones de caracteres en el tiempo de configuración de MySQL
shell> cmake . -DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci
Para ver los valores de las variables de conjunto de caracteres y colaciones que se aplican a su conexión, utilice estas declaraciones:
SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';
Esto puede ser larga respuesta, pero no es todo manera, se puede utilizar. Espero que mi respuesta sea útil para ti. para obtener más información http://dev.mysql.com/doc/refman/5.7/en/charset-applications.html
Para cambiar la codificación del juego de caracteres a UTF-8 para la base de datos, escriba el siguiente comando en el indicador mysql>. USO ALTER DATABASE
.. Reemplazar DBNAME con el nombre de base de datos:
ALTER DATABASE DBNAME CHARACTER SET utf8 COLLATE utf8_general_ci;
Este es un duplicado de esta pregunta How to convert an entire MySQL database characterset and collation to UTF-8?
Fije su database collation
a UTF-8
luego aplicar table collation
a los valores de base de datos.
BASE DE DATOS DE CONEXIÓN A UTF-8
$connect = mysql_connect('$localhost','$username','$password') or die(mysql_error());
mysql_set_charset('utf8',$connect);
mysql_select_db('$database_name','$connect') or die(mysql_error());
- 1. ¿Cómo puedo hacer que mi comparer genérico (IComparer) maneje nulos?
- 2. ¿Cómo puedo hacer que Ruby on Rails maneje errores de registro duplicados de MySQL?
- 3. Java + MySQL UTF8 Problema
- 4. ¿Puedo hacer que git-svn maneje svn: eol-style?
- 5. MySQL UTF8 varchar columna tamaño
- 6. MySQL UTF8 con Hibernate 3 y Spring
- 7. cómo hacer que phpMyAdmin import datetime correctamente desde csv?
- 8. Flujo de trabajo UTF8 PHP, MySQL resume
- 9. ¿Cómo decirle al depurador de LLDB que no maneje SIGBUS?
- 10. MySQL Convertir datos latin1 a UTF8
- 11. ¿Cómo hacer que Git Merge maneje cambios no confirmados en mi árbol de trabajo?
- 12. Esperando que se maneje el evento
- 13. mysql: ESTABLECER NOMBRES utf8 en cada conexión?
- 14. php json_encode utf8 char problema (mysql)
- 15. ¿Cómo hacer que Scanner lea correctamente los caracteres de escape?
- 16. ¿Cómo hacer que las cadenas de cantidad rusas funcionen correctamente?
- 17. ¿Cómo puedo hacer que el texto gire correctamente?
- 18. ¿Cómo hacer que Django slugify funcione correctamente con cadenas Unicode?
- 19. ¿Cómo hacer que Eclipse formatee correctamente el código JSP?
- 20. MySQL - Convertir caracteres latin1 en una mesa de UTF8 en UTF8
- 21. Cómo configurar correctamente la zona horaria mysql
- 22. ¿Cómo hacer que ncurses muestre los caracteres UTF-8 correctamente en C?
- 23. ¿Cómo hacer la autenticación en UIWebView correctamente?
- 24. Cómo hacer correctamente un sinónimo público
- 25. ¿Cómo hacer correctamente HttpResponseRedirect con reverse?
- 26. Convertir tablas de mysql de latin1 a utf8
- 27. MySQL - Los caracteres rusos se muestran correctamente
- 28. SQL Server utf8 howto?
- 29. ¿Cómo hacer que mysql se inicie automáticamente? (solo linux-cli)
- 30. MySQL: cómo hacer que las filas se repitan x veces
Realmente espero que tengamos una respuesta integral, que abarca diversas versiones de MySQL, incompatibilidades, etc. –
Ver también http://stackoverflow.com/questions/2344118/utf -8-general-bin-unicode – tripleee
@ EdwardZ.Yang - MySQL 4.1 presentó 'CHARACTER SETs'; 5.1.24 lío con la compilación de sharp-s alemán (ß), que se rectificó agregando otra colación en 5.1.62 (posiblemente empeorando las cosas); 5.5.3 completó utf8 con el nuevo juego de caracteres utf8mb4. –