Cómo hacer que MySQL maneje UTF-8 correctamente
Pregunta
Una de las respuestas a una pregunta que hice ayer Sugerí que debería asegurarme de que mi base de datos pueda manejar caracteres UTF-8 correctamente.¿Cómo puedo hacer esto con MySQL?
Solución
Actualizar:
Respuesta corta: casi siempre deberías utilizar el utf8mb4
juego de caracteres y utf8mb4_unicode_ci
colación.
Para alterar la base de datos:
ALTER DATABASE dbname CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
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 superiores tienen un juego de caracteres predeterminado de UTF-8.Puedes verificar esto en tu my.cnf
archivo, recuerde configurar ambos cliente y servidor (default-character-set
y character-set-server
).
Si tiene datos existentes que desea convertir a UTF-8, descargue su base de datos e impórtela nuevamente como UTF-8 asegurándose de:
- usar
SET NAMES utf8
antes de consultar/insertar en la base de datos - usar
DEFAULT CHARSET=utf8
al crear nuevas tablas - En este punto, su cliente y servidor MySQL deberían estar en UTF-8 (consulte
my.cnf
).Recuerde que cualquier lenguaje que utilice (como PHP) también debe ser UTF-8.Algunas versiones de PHP utilizará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.¡Pueden ocurrir muchas modificaciones extrañas de datos cuando las cosas no salen según lo planeado!
Algunos recursos:
- completar la migración UTF-8 (cdbaby.com)
- artículo sobre Preparación UTF-8 de funciones php (tenga en cuenta que parte de esta información está desactualizada)
Otros consejos
Para que esto sea "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%';
Verifica que estén todos utf8
, excepto ..._filesystem
, que debería ser binary
y ..._dir
, que apunta a algún lugar de la instalación de MySQL.
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 (solo permite caracteres de tres bytes y más pequeños).
Use utf8mb4
como su juego de caracteres si quiere " full " UTF-8.
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 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 información ;
UTF8 todo el camino
Los enlaces anteriores proporcionan la " se requiere una respuesta canónica detallada para abordar todas las inquietudes " ;. - Hay un límite de espacio en este foro.
Editar
Además de COLLATION utf8mb4_unicode_520_ci
que contiene " all " Para los personajes del mundo, <=> es discutible la mejor clasificación para usar. (También hay colaciones turcas, españolas, etc. para aquellos que quieren los matices en esos idiomas).
El juego de caracteres es una propiedad de la base de datos (predeterminado) 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 conjunto de caracteres de la base de datos o cambiarlo:
ALTER TABLE `foo`.`bar` CHARACTER SET utf8;
Para cambiar la codificación del juego de caracteres a UTF-8 para la base de datos en sí, escriba el siguiente comando en mysql > rápido. USE ALTER DATABASE
.. Reemplace 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 completo de caracteres y colación de la base de datos MySQL a UTF-8?
Seguí la solución de Javier, pero agregué algunas líneas diferentes en my.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 de usuario en la parte inferior de la página. Menciona que skip-character-set-client-handshake tiene alguna importancia.
Estos consejos sobre MySQL y UTF-8 pueden ser útiles . Desafortunadamente, no constituyen una solución completa, solo problemas comunes.
Establezca su database collation
en UTF-8
luego aplique table collation
a la base de datos predeterminada.
Su respuesta es que puede configurar mediante la configuración de MySql.En Mi respuesta puede haber algo fuera de contexto, pero esto también es de ayuda para usted.
cómo configurar Character Set
y Collation
.
Para aplicaciones que almacenan datos con el juego de caracteres predeterminado de MySQL y la intercalación (
latin1, latin1_swedish_ci
), sin configuración especial debería ser necesario.Si las aplicaciones requieren almacenamiento de datos mediante un diferente juego de caracteres o intercalación, puede configurar el juego de caracteres información 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 caracteres al iniciar el servidor. Esto hace que el servidor use la configuración dada para todas las aplicaciones que no hacen otros arreglos.
- Especificar la configuración de caracteres en el momento de la configuración, si construyes mysql desde la fuente.Esto hace que el servidor utilice la configuración dada para todos los aplicaciones, sin tener que especificarlas al iniciar el servidor.
Los ejemplos que se muestran aquí para su pregunta para configurar el conjunto de caracteres utf8, aquí también configuran la intercalación para que sea más útil (utf8_general_ci
cotejo`).
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 el momento de la configuración de MySQL
shell> cmake . -DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci
Para ver los valores del juego de caracteres y las variables del sistema de intercalación que se aplican a su conexión, utilice estas declaraciones:
SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';
Esta puede ser una respuesta larga, pero hay todas las formas que puedes usar.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
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());
Establezca 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);
}
Pude 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;