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 correctamente los caracteres UTF-8. ¿Cómo puedo hacer esto con MySQL?

 78
Author: Community, 2008-10-14

14 answers

Actualización:

Respuesta corta - Casi siempre debería usar el conjunto de caracteres utf8mb4 y la intercalación utf8mb4_unicode_ci.

Véase:

Respuesta original:

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

Si tiene datos existentes que desea convertir a UTF-8, vuelque su base de datos e impórtela como UTF-8 asegurándose de:

  • use SET NAMES utf8 antes que usted consultar / insertar en la base de datos
  • use DEFAULT CHARSET=utf8 al crear nuevas tablas
  • en este punto, su cliente y servidor MySQL deben estar en UTF-8 (ver my.cnf). recuerde que cualquier lenguaje que use (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 los datos existentes, recuerde hacer una copia de seguridad primero! Un montón de choping extraño de datos puede suceder cuando las cosas no van como ¡planeado!

Algunos recursos:

 61
Author: Owen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-02 02:08:37

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 todos sean utf8, excepto ..._filesystem, que debería ser binary y ..._dir, que apunta a algún lugar de la instalación de MySQL.

 36
Author: Javier,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-12 11:10:23

MySQL 4.1 y superior tiene un conjunto 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 conjunto de caracteres si desea UTF-8 "completo".

 28
Author: T.W.R. Cole,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-11 21:08:18

La respuesta corta: Usa 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 except 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 todos el camino

Los enlaces anteriores proporcionan la "respuesta canónica detallada es necesaria para abordar todas las preocupaciones". -- Hay un límite de espacio en este foro.

Editar

Además de CHARACTER SET utf8mb4 que contiene "todos" los caracteres del mundo, COLLATION utf8mb4_unicode_520_ci es discutible la 'mejor combinación' para usar. (También hay turco, español, etc, colaciones para aquellos que quieren los matices en esos idiomas.)

 18
Author: Rick James,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:26:17

El conjunto de caracteres es una propiedad de la base de datos (por defecto) y de 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 comprobar el conjunto de caracteres de su base de datos o cambiarlo:

ALTER TABLE `foo`.`bar` CHARACTER SET utf8;
 4
Author: extraneon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-14 18:32:39

Para cambiar la codificación del conjunto de caracteres a UTF-8 para la propia base de datos, escriba el siguiente comando en el símbolo del sistema mysql>. UTILIZAR ALTER DATABASE.. Reemplazar 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 su intercalación a UTF-8?

 2
Author: Nyein Aung,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:34:25

Estos consejos sobre MySQL y UTF-8 pueden ser útiles. Desafortunadamente, no constituyen una solución completa, solo trampas comunes.

 0
Author: Edward Z. Yang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-15 05:05:33

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

 0
Author: Vlad Balan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-20 12:14:19

Establezca su database collation en UTF-8 luego aplique table collation al valor predeterminado de la base de datos.

 0
Author: Gaurav Lad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-25 08:01:34

Su respuesta es que puede configurar por MySQL Settings. En Mi respuesta puede ser algo fuera de contexto, pero esto también es saber es ayuda para usted.
cómo configurar Character Set y Collation.

Para aplicaciones que almacenan datos utilizando el conjunto de caracteres predeterminado de MySQL y colación (latin1, latin1_swedish_ci), sin configuración especial debería ser necesario. Si las aplicaciones requieren almacenamiento de datos mediante un conjunto de caracteres diferentes o intercalación, puede configurar el conjunto de caracteres información varias maneras:

  • Especifique la configuración de caracteres por base de datos. Por ejemplo, aplicaciones que utilizan una base de datos podría requerir utf8, mientras que las aplicaciones que usar otra base de datos puede requerir sjis.
  • Especifique la configuración de caracteres al iniciar el servidor. Esto hace que el servidor para utilizar la configuración dada para todas las aplicaciones que no hacen otro arreglo.
  • Especifique la configuración de caracteres en el momento de la configuración, si compila MySQL de la fuente. Esto hace que el servidor use la configuración dada para todos aplicaciones, sin tener que especificarlas al iniciar el servidor.

Los ejemplos que se muestran aquí para que su pregunta establezca el conjunto de caracteres utf8 , aquí también establezca la intercalación para más útil(utf8_general_ci intercalación`).

Especificar la configuración de caracteres por base de datos

  CREATE DATABASE new_db
  DEFAULT CHARACTER SET utf8
  DEFAULT COLLATE utf8_general_ci;

Especificar la configuración de caracteres al iniciar el servidor

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

Especificar la configuración de caracteres en MySQL tiempo de configuración

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, utilice estas instrucciones:

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

Esta puede ser una respuesta larga, pero hay todo el camino, se puede utilizar. Esperanzado mi respuesta es útil para usted. para más información http://dev.mysql.com/doc/refman/5.7/en/charset-applications.html

 -1
Author: Vipin Jain,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-20 06:27:37

SET NAMES UTF8

Este es el truco

 -2
Author: Claudio,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-26 10:18:44

Establezca la conexión de su base de datos en UTF8:

  if($handle = @mysql_connect(DB_HOST, DB_USER, DB_PASS)){          
         //set to utf8 encoding
         mysql_set_charset('utf8',$handle);
  }
 -2
Author: fin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-23 07:30:14

CONEXIÓN DE LA 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());
 -2
Author: sunil subramanya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-14 10:09:32

Fue capaz de encontrar una solución. Ejecutó 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;
 -3
Author: Nishant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-09 08:00:07