2008-10-14 9 views
77

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

+4

Realmente espero que tengamos una respuesta integral, que abarca diversas versiones de MySQL, incompatibilidades, etc. –

+0

Ver también http://stackoverflow.com/questions/2344118/utf -8-general-bin-unicode – tripleee

+1

@ 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. –

Respuesta

59

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:

+20

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." –

+6

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

+0

* (¡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 –

-2

SET NAMES UTF8

Esto es hace el truco

+1

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

35

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.

+0

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);' –

+0

The "SHOW VARIABLES LIKE 'character_set%';" comando me reveló el problema con mi conexión. ¡Gracias! – javsmo

+0

Esto no es correcto. Lo que MySQL llama 'utf8' no es" completo "UTF-8. –

4

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; 
+0

Esto no es correcto.Lo que MySQL llama 'utf8' no es" completo "UTF-8. –

0

Estos tips on MySQL and UTF-8 puede ser útil. Desafortunadamente, no constituyen una solución completa, solo problemas comunes.

0

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.

-2

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); 
    } 
+0

Si ejecuta PHP, no use la interfaz obsoleta 'mysql_ *'. Cambia a 'mysqli_ *' o 'PDO'. –

24

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.

+4

Lamentablemente, esta es la única respuesta correcta hasta el momento. – Basti

+5

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

+0

@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). –

-3

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; 
+0

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

+0

Además, no es una solución completa. Las columnas necesitan 'CHARACTER SET utf8'. 'root' no ejecutará el importantísimo' init_connect'. –

15

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 MySQL
  • CHARACTER 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í)

More info;
UTF8 all the way

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.)

+0

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 –

-1

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

1

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?

0

Fije su database collation a UTF-8 luego aplicar table collation a los valores de base de datos.

-2

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()); 
Cuestiones relacionadas