charset - Cómo hacer que MySQL maneje UTF-8 apropiadamente
utf8mb4 mysql (14)
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?
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());
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);
}
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;
Establezca la database collation
en UTF-8
luego aplique la table collation
a la base de datos predeterminada.
Estos consejos sobre MySQL y UTF-8 pueden ser útiles. Desafortunadamente, no constituyen una solución completa, solo problemas comunes.
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. -
<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 "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).
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)
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".
Para cambiar la codificación 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?
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.
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;
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.
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 compila 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