español - ¿Cambiar el conjunto de caracteres predeterminado de MySQL a UTF-8 en my.cnf?
mysql set names latin1 (18)
Actualmente estamos usando los siguientes comandos en PHP para establecer el conjunto de caracteres en UTF-8 en nuestra aplicación.
Ya que esto es un poco de sobrecarga, 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 conjunto 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?
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
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 resultar en un error como:
inicio: el trabajo no se pudo iniciar
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/ |
+--------------------------+----------------------------+
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)
En fedora 21
$ vi /etc/my.cnf
Añadir 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 recuerde reiniciar el servicio mysqld con el service mysqld restart
.
Esta pregunta ya tiene muchas respuestas, pero Mathias Bynens mencionó que se debería usar ''utf8mb4'' en lugar de ''utf8'' para tener un mejor soporte de UTF-8 (''utf8'' no admite caracteres de 4 bytes, los campos están truncados en la inserción ). Considero que esto es una diferencia importante. Así que aquí hay otra respuesta sobre cómo establecer el conjunto de caracteres y la intercalación predeterminados. Una que te permita insertar una pila de caca ().
Esto funciona en MySQL 5.5.35.
Tenga en cuenta que algunos de los ajustes pueden ser opcionales. Como no estoy completamente seguro de no haber olvidado nada, haré de esta respuesta una wiki de la comunidad.
Ajustes antiguos
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
Nuevas Configuraciones
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 siempre es utf8 .
Esto no afectará las tablas existentes, es solo la configuración predeterminada (utilizada para tablas nuevas). El siguiente código ALTER se puede usar para convertir una tabla existente (sin la solución temporal de restauración de volcado):
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. Al emitir SET NAMES utf8
(utf8mb4 no disponible en esa versión) también se configuran en utf8.
Advertencia : si tenía una tabla utf8 con una columna de índice de tipo VARCHAR (255), en algunos casos no se puede convertir, porque se excede 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.
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 ser importantes al realizar 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á collation_connection a utf8_unicode_ci
init_connect=''SET collation_connection = utf8_unicode_ci''
Utilizando 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 para qué es esto. No lo uso sin embargo:
skip-character-set-client-handshake
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)
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í evita la necesidad de incluir init-connect
en [mysqld]
y el default-character-set
en las secciones [client]
y [mysql]
.
NijaCat estaba cerca, pero especificó exceso:
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)
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 una base de datos existente, hágamelo saber ... su pregunta no lo especificó directamente, por lo 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á en desuso, creo.
Como dice Justin Ball en " Actualiza a MySQL 5.5.12 y ahora MySQL no se inicia , debes:
Quita esa directiva y deberías estar bien.
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
Reinicie MySQL.
Para asegurarse, su MySQL es UTF-8, ejecute las siguientes consultas en su indicador de MySQL:
Primera consulta:
mysql> show variables like ''char%'';
La salida debe verse como:
+--------------------------+---------------------------------+ | 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 la salida de la consulta es:
+----------------------+-----------------+ | Variable_name | Value | +----------------------+-----------------+ | collation_connection | utf8_general_ci | | collation_database | utf8_unicode_ci | | collation_server | utf8_unicode_ci | +----------------------+-----------------+
Puede hacerlo de la manera que lo hace, y si no funciona, debe reiniciar mysql.
Si su configuración para el cliente lo confunde y la conexión se restablece después de reiniciar el servicio mysql. Prueba estos pasos (que funcionaron para mí):
-
vi /etc/my.cnf
- agregue el contenido soplado y
:wq [client] character-sets-dir=/usr/local/mysql/share/mysql/charsets
- reinicie mysql e inicie sesión en mysql, use la base de datos, ingrese el
status;
comandostatus;
, encontrará el conjunto de caracteres para ''cliente'' y ''conn'' está establecido en ''utf8''.
Compruebe la reference para más información.
Si tiene problemas para confirmar la compatibilidad del conjunto de caracteres del cliente con MySQL Workbench, tenga en cuenta la siguiente nota:
Importante Todas las conexiones abiertas por MySQL Workbench configuran automáticamente el conjunto de caracteres del cliente en utf8. El cambio manual del 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 sobre los conjuntos de caracteres del cliente, consulte Conjuntos de caracteres de conexión y colaciones.
Por lo tanto, no pude anular los conjuntos de caracteres de MySQL Workbench con los cambios de my.cnf. por ejemplo, ''set names utf8mb4''
También descubrí que después de configurar default-character-set = utf8
bajo [mysqld]
title, MySQL 5.5.x no se iniciaría bajo Ubuntu 12.04 (Precise Pangolin).
Todas las configuraciones enumeradas aquí son correctas, 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
Agregue estos a /etc/mysql/my.cnf
.
Tenga en cuenta que elijo el tipo de colación utf8_unicode_ci 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 usuario no SUPER !
Por ejemplo, la diferencia entre la conexión como usuario SUPER y no SUPER (por supuesto, en el caso de la intercalació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 permiso no SUPER .
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 detalle 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 esto y el artículo ayuden a aclarar los momentos inciertos.
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