¿Cambiar el conjunto de caracteres predeterminado de MySQL a UTF-8 en my.cnf?

Actualmente estamos usando los siguientes comandos en PHP para configurar el juego de caracteres en UTF-8 en nuestra aplicación.

Como esto es un poco elevado, nos gustaría establecer esto como la configuración predeterminada en MySQL. ¿Podemos hacer esto en /etc/my.cnf o en otra ubicación?

SET NAMES 'utf8' SET CHARACTER SET utf8 

He buscado un juego de caracteres predeterminado en /etc/my.cnf, pero no hay nada sobre los conjuntos de caracteres.

En este punto, hice lo siguiente para establecer el conjunto de caracteres MySQL y las variables de intercalación en UTF-8:

 skip-character-set-client-handshake character_set_client=utf8 character_set_server=utf8 

¿Es esa una forma correcta de manejar esto?

Para establecer el valor predeterminado en UTF-8, desea agregar lo siguiente a my.cnf

 [client] default-character-set=utf8 [mysql] default-character-set=utf8 [mysqld] collation-server = utf8_unicode_ci init-connect='SET NAMES utf8' character-set-server = utf8 

Si desea cambiar el conjunto de caracteres para un DB existente, hágamelo saber … su pregunta no lo especificó directamente, así que no estoy seguro de si eso es lo que quiere hacer.

Para la versión reciente de MySQL,

 default-character-set = utf8 

causa un problema Está obsoleto, creo.

Como dice Justin Ball en ” Upgrade to MySQL 5.5.12 y ahora MySQL no se iniciará , debes:

  1. Elimina esa directiva y deberías ser bueno.

  2. Entonces su archivo de configuración (‘/etc/my.cnf’, por ejemplo) debería verse así:

     [mysqld] collation-server = utf8_unicode_ci init-connect='SET NAMES utf8' character-set-server = utf8 
  3. Reinicia MySQL.

  4. Para asegurarse de que su MySQL es UTF-8, ejecute las siguientes consultas en su indicador de MySQL:

    • Primera consulta:

        mysql> show variables like 'char%'; 

      La salida debería verse así:

        +--------------------------+---------------------------------+ | Variable_name | Value | +--------------------------+---------------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | utf8 | | character_set_system | utf8 | | character_sets_dir | /usr/local/mysql/share/charsets/| +--------------------------+---------------------------------+ 
    • Segunda consulta:

        mysql> show variables like 'collation%'; 

      Y el resultado de la consulta es:

        +----------------------+-----------------+ | Variable_name | Value | +----------------------+-----------------+ | collation_connection | utf8_general_ci | | collation_database | utf8_unicode_ci | | collation_server | utf8_unicode_ci | +----------------------+-----------------+ 

En MySQL 5.5 tengo en mi.cnf

 [mysqld] init_connect='SET collation_connection = utf8_unicode_ci' init_connect='SET NAMES utf8' character-set-server=utf8 collation-server=utf8_unicode_ci skip-character-set-client-handshake 

El resultado es

 mysql> show variables like "%character%";show variables like "%collation%"; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | utf8 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+ 8 rows in set (0.00 sec) +----------------------+-----------------+ | Variable_name | Value | +----------------------+-----------------+ | collation_connection | utf8_unicode_ci | | collation_database | utf8_unicode_ci | | collation_server | utf8_unicode_ci | +----------------------+-----------------+ 3 rows in set (0.00 sec) 

Esta pregunta ya tiene muchas respuestas, pero Mathias Bynens mencionó que se debe usar ‘utf8mb4’ en lugar de ‘utf8’ para tener mejor compatibilidad con UTF-8 (‘utf8’ no admite caracteres de 4 bytes, los campos se truncan al insertar ) Considero que esto es una diferencia importante. Así que aquí hay otra respuesta sobre cómo establecer el conjunto de caracteres predeterminado y la intercalación. Uno que te permita insertar una stack de poo (💩).

Esto funciona en MySQL 5.5.35.

Tenga en cuenta que algunas de las configuraciones pueden ser opcionales. Como no estoy completamente seguro de que no haya olvidado nada, haré de esta respuesta una wiki comunitaria.

Configuraciones antiguas

 mysql> SHOW VARIABLES LIKE 'char%'; SHOW VARIABLES LIKE 'collation%'; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | latin1 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | latin1 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+ 8 rows in set (0.00 sec) +----------------------+-------------------+ | Variable_name | Value | +----------------------+-------------------+ | collation_connection | utf8_general_ci | | collation_database | latin1_swedish_ci | | collation_server | latin1_swedish_ci | +----------------------+-------------------+ 3 rows in set (0.00 sec) 

Config

 # 💩 𝌆 # UTF-8 should be used instead of Latin1. Obviously. # NOTE "utf8" in MySQL is NOT full UTF-8: http://mathiasbynens.be/notes/mysql-utf8mb4 [client] default-character-set = utf8mb4 [mysqld] character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci [mysql] default-character-set = utf8mb4 

Nueva configuración

 mysql> SHOW VARIABLES LIKE 'char%'; SHOW VARIABLES LIKE 'collation%'; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | utf8mb4 | | character_set_connection | utf8mb4 | | character_set_database | utf8mb4 | | character_set_filesystem | binary | | character_set_results | utf8mb4 | | character_set_server | utf8mb4 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+ 8 rows in set (0.00 sec) +----------------------+--------------------+ | Variable_name | Value | +----------------------+--------------------+ | collation_connection | utf8mb4_general_ci | | collation_database | utf8mb4_unicode_ci | | collation_server | utf8mb4_unicode_ci | +----------------------+--------------------+ 3 rows in set (0.00 sec) 

character_set_system es siempre utf8 .

Esto no afectará a las tablas existentes, solo es la configuración predeterminada (utilizada para las tablas nuevas). El siguiente código ALTER se puede usar para convertir una tabla existente (sin la solución alternativa de recuperación de volcados):

 ALTER DATABASE databasename CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ALTER TABLE tablename CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; 

Editar:

En un servidor MySQL 5.0: character_set_client, character_set_connection, character_set_results, collation_connection permanecen en latin1. Emitir SET NAMES utf8 (utf8mb4 no disponible en esa versión) también los establece en utf8.


Advertencia : si tenía una tabla utf8 con una columna de índice de tipo VARCHAR (255), no se puede convertir en algunos casos, porque se excedió la longitud máxima de la clave (la Specified key was too long; max key length is 767 bytes. ) Si es posible, reduzca el tamaño de la columna de 255 a 191 (porque 191 * 4 = 764 <767 <192 * 4 = 768). Después de eso, la tabla se puede convertir.

También descubrí que después de establecer default-character-set = utf8 bajo el título [mysqld] , MySQL 5.5.x no se iniciaba en Ubuntu 12.04 (Precise Pangolin).

NijaCat estuvo cerca, pero especificó una exageración:

Para establecer el valor predeterminado en UTF-8, desea agregar lo siguiente a my.cnf

 [client] default-character-set=utf8 [mysqld] default-character-set = utf8 

Luego, para verificar:

 mysql> show variables like "%character%";show variables like "%collation%"; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | utf8 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+ 8 rows in set (0.00 sec) +----------------------+-----------------+ | Variable_name | Value | +----------------------+-----------------+ | collation_connection | utf8_general_ci | | collation_database | utf8_general_ci | | collation_server | utf8_general_ci | +----------------------+-----------------+ 3 rows in set (0.00 sec) 

Nota: el archivo my.cnf se encuentra en /etc/mysql/

Después de agregar estas líneas:

 [mysqld] collation-server = utf8_unicode_ci init-connect='SET NAMES utf8' character-set-server = utf8 skip-character-set-client-handshake [client] default-character-set = utf8 [mysql] default-character-set = utf8 

No te olvides de reiniciar el servidor:

 sudo service mysql restart 

MySQL v5.5.3 y superior:

Solo agregue tres líneas solo en la sección [mysqld]:

 [mysqld] character-set-server = utf8 collation-server = utf8_unicode_ci skip-character-set-client-handshake 

Nota: La inclusión de skip-character-set-client-handshake aquí obvia la necesidad de incluir init-connect en [mysqld] y default-character-set en las secciones [client] y [mysql] .

Bajo Xubuntu 12.04 simplemente agregué

 [mysqld] character_set_server = utf8 

a /etc/mysql/my.cnf

Y el resultado es

 mysql> show variables like "%character%";show variables like "%collation%"; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | utf8 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+ 8 rows in set (0.00 sec) +----------------------+-----------------+ | Variable_name | Value | +----------------------+-----------------+ | collation_connection | utf8_general_ci | | collation_database | utf8_general_ci | | collation_server | utf8_general_ci | +----------------------+-----------------+ 3 rows in set (0.00 sec) 

También eche un vistazo a http://dev.mysql.com/doc/refman/5.6/en/charset-server.html

Todos los ajustes enumerados aquí son correctos, pero aquí están la solución más óptima y suficiente:

 [mysqld] init_connect='SET collation_connection = utf8_unicode_ci' character-set-server = utf8 collation-server = utf8_unicode_ci [client] default-character-set = utf8 

/etc/mysql/my.cnf a /etc/mysql/my.cnf .

Tenga en cuenta que elijo utf8_unicode_ci tipo de colación debido al problema de rendimiento.

El resultado es:

 mysql> SHOW VARIABLES LIKE 'character%'; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | utf8 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+ mysql> SHOW VARIABLES LIKE 'collation%'; +----------------------+-----------------+ | Variable_name | Value | +----------------------+-----------------+ | collation_connection | utf8_unicode_ci | | collation_database | utf8_unicode_ci | | collation_server | utf8_unicode_ci | +----------------------+-----------------+ 

¡Y esto es cuando te conectas como un usuario no SUPER !

Por ejemplo, la diferencia entre la conexión como usuario SUPER y no SUPER (por supuesto en caso de colación utf8_unicode_ci ):

usuario con SUPER priv .:

 mysql> SHOW VARIABLES LIKE 'collation%'; +----------------------+-----------------+ | Variable_name | Value | +----------------------+-----------------+ | collation_connection | utf8_general_ci | <--- | collation_database | utf8_unicode_ci | | collation_server | utf8_unicode_ci | +----------------------+-----------------+ 

usuario con no-SUPER priv .:

 mysql> SHOW VARIABLES LIKE 'collation%'; +----------------------+-----------------+ | Variable_name | Value | +----------------------+-----------------+ | collation_connection | utf8_unicode_ci | | collation_database | utf8_unicode_ci | | collation_server | utf8_unicode_ci | +----------------------+-----------------+ 

Escribí un artículo completo (rus) explicando en detalles por qué debería usar una u otra opción. Se consideran todos los tipos de conjuntos de caracteres y colaciones : para servidor, para base de datos, para conexión, para tabla e incluso para columna.

Espero que este y el artículo ayuden a aclarar momentos poco claros.

La directiva ha cambiado a character-set-system=utf8

http://dev.mysql.com/doc/refman/5.6/en/charset-configuration.html

Las versiones de MySQL y las distribuciones de Linux pueden importar al hacer configuraciones.

Sin embargo, se recomiendan los cambios en la sección [mysqld] .

Quiero dar una breve explicación de la respuesta de tomazzlender:

 [mysqld] init_connect='SET collation_connection = utf8_unicode_ci' init_connect='SET NAMES utf8' character-set-server=utf8 collation-server=utf8_unicode_ci skip-character-set-client-handshake 

[mysqld]

Esto cambiará la conexión_colación a utf8_unicode_ci

 init_connect='SET collation_connection = utf8_unicode_ci' 

Usando SET NAMES :

 init_connect='SET NAMES utf8' 

Los SET NAMES influirán en tres caracteres, es decir:

 character_set_client character_set_results character_set_connection 

Esto establecerá character_set_database & character_set_server

 character-set-server=utf8 

Esto solo afectará a collation_database & collation_server

 collation-server=utf8_unicode_ci 

Lo siento, no estoy tan seguro de qué es esto. No lo uso sin embargo:

 skip-character-set-client-handshake 

En Fedora 21

 $ vi /etc/my.cnf 

Agregar seguir:

 [client] default-character-set=utf8 [mysql] default-character-set=utf8 [mysqld] init_connect='SET collation_connection = utf8_unicode_ci' init_connect='SET NAMES utf8' character-set-server=utf8 collation-server=utf8_unicode_ci skip-character-set-client-handshake 

Guardar y Salir.

Final recuerda reiniciar el servicio mysqld con el service mysqld restart .

MySQL 5.5, todo lo que necesitas es:

 [mysqld] character_set_client=utf8 character_set_server=utf8 collation_server=utf8_unicode_ci 

collation_server es opcional.

 mysql> show variables like 'char%'; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | utf8 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+ 8 rows in set (0.00 sec) 

Si tiene problemas para confirmar la compatibilidad del conjunto de caracteres del cliente utilizando MySQL Workbench, tenga en cuenta la siguiente nota:

Importante Todas las conexiones abiertas por MySQL Workbench establecen automáticamente el conjunto de caracteres del cliente en utf8. Cambiar manualmente el conjunto de caracteres del cliente, como el uso de SET NAMES …, puede hacer que MySQL Workbench no muestre correctamente los caracteres. Para obtener información adicional acerca de los juegos de caracteres del cliente, vea Conjuntos de caracteres de conexión y intercalaciones.

Por lo tanto, no pude anular los conjuntos de caracteres de MySQL Workbench con los cambios de my.cnf. por ejemplo, ‘set names utf8mb4’

Si su configuración para el cliente lo confunde y se restablece conn después de reiniciar el servicio de mysql. Pruebe estos pasos (que funcionó para mí):

  1. vi /etc/my.cnf
  2. agregue los contenidos blow y :wq [client] character-sets-dir=/usr/local/mysql/share/mysql/charsets
  3. reinicie mysql e inicie sesión en mysql, utilice la base de datos, ingrese el status; comando status; , encontrará el conjunto de caracteres para ‘cliente’ y ‘conn’ está configurado a ‘utf8’.

Verifique la referencia para más información.

Puedes hacerlo de la forma en que lo hace, y si no funciona, debes reiniciar mysql.

Cambiar el caracter de MySQL:

Cliente

 default-character-set=utf8 

mysqld

 character_set_server=utf8 

No deberíamos escribir default-character-set=utf8 en mysqld, porque eso podría default-character-set=utf8 un error como:

inicio: Error al iniciar el trabajo

Al final:

  +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | utf8 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+