Cómo hacer que MySQL maneje UTF-8 apropiadamente

Una de las respuestas a una pregunta que hice ayer me 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?

Actualizar:

Respuesta corta: casi siempre deberías usar el utf8mb4 caracteres utf8mb4_unicode_ci y la intercalación utf8mb4_unicode_ci .

Ver:

Respuesta Original:

MySQL 4.1 y superior tiene un juego de caracteres predeterminado de UTF-8. Puede verificar esto en su archivo my.cnf , recuerde configurar tanto el cliente como el servidor ( default-character-set character-set-server default-character-set character-set-server ).

Si tiene datos existentes que desea convertir a UTF-8, vacíe su base de datos y vuelva a importarla como UTF-8 asegurándose de que:

  • use SET NAMES utf8 antes de consultar / insertar en la base de datos
  • use DEFAULT CHARSET=utf8 al crear nuevas tablas
  • en este punto, su cliente y servidor MySQL debe estar en UTF-8 (vea 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 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:

  • completar la migración UTF-8 (cdbaby.com)
  • artículo sobre la preparación UTF-8 de las funciones de 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 verificar, ve al cliente y muestra algunas variables:

 SHOW VARIABLES LIKE 'character_set%'; 

Verifique que todos sean utf8 , excepto ..._filesystem , que debe ser binary y ..._dir , que apunta a alguna parte de la instalación de MySQL.

MySQL 4.1 y superior tiene un juego de caracteres predeterminado que llama utf8 pero que en realidad es solo un subconjunto de UTF-8 (solo permite caracteres de tres bytes y más pequeños).

Use utf8mb4 como su utf8mb4 caracteres si quiere UTF-8 “completo”.

La respuesta corta: use utf8mb4 en 4 lugares:

  • Los bytes en su cliente son utf8, 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 columnas que son estrictamente ascii / hex / country_code / zip_code / etc.
  • si está enviando a HTML. (Sí, la ortografía es diferente aquí).

Más información ;
UTF8 todo el camino

Los enlaces anteriores proporcionan la “respuesta canónica detallada necesaria para abordar todas las inquietudes”. – Hay un límite de espacio en este foro.

Editar

Además del CHARACTER SET utf8mb4 contiene “todos” los caracteres del mundo, COLLATION utf8mb4_unicode_520_ci es discutible como la mejor clasificación para usar. (También hay colaciones turcas, españolas, etc. para aquellos que desean los matices en esos idiomas).

El juego de caracteres es una propiedad de la base de datos (por defecto) y la tabla. Puedes echar un vistazo (comandos 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; es bastante fácil verificar el juego de caracteres de la base de datos o cambiarlo:

 ALTER TABLE `foo`.`bar` CHARACTER SET utf8; 

Para cambiar la encoding del conjunto de caracteres a UTF-8 para la base de datos misma, escriba el siguiente comando en el indicador mysql>. UTILIZA ALTER DATABASE .. Reemplaza DBNAME con el nombre de la base de datos:

 ALTER DATABASE DBNAME CHARACTER SET utf8 COLLATE utf8_general_ci; 

Este es un duplicado de esta pregunta ¿Cómo convertir un conjunto de caracteres completo de la base de datos MySQL y la intercalación a UTF-8?

Estos consejos sobre MySQL y UTF-8 pueden ser útiles. 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 

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. Él menciona que skip-character-set-client-handshake tiene cierta importancia.

Establezca la database collation en UTF-8 luego aplique la table collation a la base de datos predeterminada.

Su respuesta es que puede configurar mediante 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 el Character Set y la Collation

Para las aplicaciones que almacenan datos utilizando el conjunto de caracteres MySQL predeterminado y la intercalación ( latin1, latin1_swedish_ci ), no se necesita ninguna configuración especial. Si las aplicaciones requieren almacenamiento de datos utilizando un juego de caracteres o intercalación diferente, puede configurar la información del juego de caracteres de varias maneras:

  • Especifique la 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 los caracteres al inicio del servidor. Esto hace que el servidor use la configuración dada para todas las aplicaciones que no hacen otros arreglos.
  • Especifique la configuración de caracteres en el momento de la configuración , si comstack MySQL desde la fuente. Esto hace que el servidor use la configuración dada para todas las aplicaciones, sin tener que especificarlas al inicio del servidor.

Los ejemplos que se muestran aquí para su pregunta para establecer el conjunto de caracteres utf8, aquí también establecen la intercalación para obtener más ayuda ( utf8_general_ci colación`).

Especifique la configuración de caracteres por base de datos

  CREATE DATABASE new_db DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; 

Especifique la configuración de caracteres al inicio del servidor

 [mysqld] character-set-server=utf8 collation-server=utf8_general_ci 

Especifique la configuración de caracteres en el tiempo de configuración de MySQL

 shell> cmake . -DDEFAULT_CHARSET=utf8 \ -DDEFAULT_COLLATION=utf8_general_ci 

Para ver los valores del conjunto de caracteres y las variables del sistema de intercalación que se aplican a su conexión, use estas declaraciones:

 SHOW VARIABLES LIKE 'character_set%'; SHOW VARIABLES LIKE 'collation%'; 

Esta puede ser una respuesta larga, pero de todos modos, puede usarla. Espero que mi respuesta sea útil para ti. para más información http://dev.mysql.com/doc/refman/5.7/en/charset-applications.html

SET NAMES UTF8

Este es el truco

Configure su conexión de base de datos a UTF8:

  if($handle = @mysql_connect(DB_HOST, DB_USER, DB_PASS)){ //set to utf8 encoding mysql_set_charset('utf8',$handle); } 

CONEXIÓN DE BASE DE DATOS 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()); 

Pude encontrar una solución. Ejecuta 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;