utf8 español charset mysql character-encoding

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.



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:

  1. Quita esa directiva y deberías estar bien.

  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. Reinicie MySQL.

  4. 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í):

  1. vi /etc/my.cnf
  2. agregue el contenido soplado y :wq [client] character-sets-dir=/usr/local/mysql/share/mysql/charsets
  3. reinicie mysql e inicie sesión en mysql, use la base de datos, ingrese el status; comando status; , 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