Actualmente estamos utilizando los siguientes comandos en PHP para establecer el conjunto de caracteres en UTF-8 en nuestra aplicación.
Dado 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 juego de caracteres predeterminado en /etc/my.cnf, pero no hay nada sobre los juegos de caracteres.
En este punto, hice lo siguiente para configurar el juego de caracteres MySQL y las variables de colació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?
mysql
character-encoding
Jorre
fuente
fuente
utf8mb4
, es decir, UTF-8 real con soporte completo de Unicode. Ver Cómo ayuda completa de Unicode en bases de datos MySQL .utf8mb4
sea un buen precedente peligroso?Respuestas:
Para establecer el valor predeterminado en UTF-8, desea agregar lo siguiente a my.cnf
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 desea hacer.
fuente
Table
CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;[mysqld]
.utf8
juego de caracteres MySQL . Usar en suutf8mb4
lugar.Para la versión reciente de MySQL,
causa un problema Está en desuso, creo.
Como dice Justin Ball en " Actualizar a MySQL 5.5.12 y ahora MySQL no se iniciará , debe:
Elimina esa directiva y deberías ser bueno.
Entonces su archivo de configuración ('/etc/my.cnf' por ejemplo) debería verse así:
Reinicie MySQL.
Para asegurarse, su MySQL es UTF-8, ejecute las siguientes consultas en su indicador de MySQL:
Primera consulta:
La salida debería verse así:
Segunda consulta:
Y el resultado de la consulta es:
fuente
character_set_filesystem | utf8
. No estoy seguro, ¿está bien?mysql Ver 15.1 Distrib 5.5.35-MariaDB, for debian-linux-gnu (x86_64) using readline 5.1
default-character-set
, en su lugar, puede cambiar aloose-default-character-set = utf8
, es decir, prefijo con 'flojo'. Esto lo hacemysqlbinlog
feliz, si necesita usarlo - google for: "loose-default-character-set" mysqlbinlog .init-connect='SET NAMES utf8'
realmente necesario? Si no, definitivamente podemos prescindir de él para el rendimiento.Esta pregunta ya tiene muchas respuestas, pero Mathias Bynens mencionó que 'utf8mb4' debería usarse en lugar de 'utf8' para tener un mejor soporte UTF-8 ('utf8' no admite caracteres de 4 bytes, los campos se truncan al insertarlos ) Considero que esta es una diferencia importante. Así que aquí hay otra respuesta sobre cómo establecer el conjunto de caracteres y la clasificación predeterminados. Uno que le permitirá insertar un montón de caca (💩).
Esto funciona en MySQL 5.5.35.
Tenga en cuenta que algunas de las configuraciones pueden ser opcionales. Como no estoy completamente seguro de no haber olvidado nada, haré que esta respuesta sea un wiki de la comunidad.
Configuraciones antiguas
Config
Nueva configuración
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 puede usarse para convertir una tabla existente (sin la solución alternativa de volcado-restauración):
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 está 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), en algunos casos no se puede convertir porque se excede la longitud máxima de la clave (
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.fuente
character_set_database
está quietoutf8
ycollation_database
es utf8_bin`. ¿Me he perdido algo?character-set-client-handshake = FALSE
a la sección [mysqld], por lo que siempre usará la codificación predeterminada, incluso si comete un error en la capa de aplicaciónEn MySQL 5.5 tengo en my.cnf
El resultado es
fuente
skip-character-set-client-handshake
exactamente y bajo qué circunstancias se requiere?show variables like "%collation%";
, veía 'collation_connection' comoutf8_general_ci
y collation_database y collation_server comoutf8_unicode_ci
. Agregar la líneaskip-character-set-client-handshake
cambió la entrada general a Unicode, por lo que los tres fueron consistentes.skip-character-set-client-handshake
hicieron por mí (junto con el "servidor de conjunto de caracteres" y "servidor de intercalación", por supuesto, en Debian 7). Elinit_connect
s no hizo una diferencia con o sin elskip
y parece redundante. +1 y gracias.Nota: el archivo my.cnf se encuentra en
/etc/mysql/
Después de agregar estas líneas:
No olvides reiniciar el servidor:
fuente
NijaCat estuvo cerca, pero especificó exageración:
Para establecer el valor predeterminado en UTF-8, desea agregar lo siguiente a my.cnf
Luego, para verificar:
fuente
[mysql] default-character-set=utf8
entonces?[mysqld]
usar encharacter-set-server
lugar dedefault-character-set
También descubrí que después de configurarlo
default-character-set = utf8
bajo el[mysqld]
título, MySQL 5.5.x no comenzaría con Ubuntu 12.04 (Precise Pangolin).fuente
[mysqld]
, debes usar encharacter-set-server
lugar dedefault-character-set
. (Extremadamente confuso, ¡estoy de acuerdo!)MySQL v5.5.3 y superior:
Simplemente agregue tres líneas solo en la sección [mysqld]:
Nota: Incluir
skip-character-set-client-handshake
aquí elimina la necesidad de incluir tantoinit-connect
en[mysqld]
comodefault-character-set
en las secciones[client]
y[mysql]
.fuente
Bajo Xubuntu 12.04 simplemente agregué
a /etc/mysql/my.cnf
Y el resultado es
También eche un vistazo a http://dev.mysql.com/doc/refman/5.6/en/charset-server.html
fuente
Todos los ajustes enumerados aquí son correctos, pero aquí están la solución más óptima y suficiente:
Añadir estos a
/etc/mysql/my.cnf
.Tenga en cuenta que elijo el tipo de clasificación utf8_unicode_ci debido al problema de rendimiento.
El resultado es:
¡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 caso de colación utf8_unicode_ci ):
usuario con SUPER priv .:
usuario con privilegio no SUPER :
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 momentos poco claros.
fuente
utf8_unicode_ci
debido a problemas de rendimiento, entonces, ¿por qué no usarutf8_bin
en su lugar?utf8_unicode_ci
. Nunca pasé tiempo probando el rendimiento.La directiva ha cambiado a
character-set-system=utf8
http://dev.mysql.com/doc/refman/5.6/en/charset-configuration.html
fuente
Las versiones de MySQL y las distribuciones de Linux pueden ser importantes al hacer configuraciones.
Sin embargo, los cambios bajo
[mysqld]
se recomiendan sección.Quiero dar una breve explicación de la respuesta de tomazzlender:
[mysqld]
Esto cambiará collation_connection a utf8_unicode_ci
Utilizando
SET NAMES
:SET NAMES influirá en tres caracteres, es decir:
Esto establecerá
character_set_database & character_set_server
Esto solo afectará a collation_database & collation_server
Lo siento, no estoy tan seguro de qué es esto. Sin embargo, no lo uso:
fuente
character_set_server
no debe establecerse manualmente.character set
al establecer la conexión de la base de datos, sin embargo, parece un poco molesto.character_set_server
en la[mysqld]
sección afectarácharacter_set_database
ycharacter_set_server
. Ahora creo que una buena práctica es señalar explícitamente locharacter set
que desea utilizar al crear una base de datos, una tabla y una conexión de base de datos. Honestamente hablando, la documentación demysql
no es tan fácil de entender. ¿Sabes si hay una forma genérica de hacer todas las configuracionescharacter set
ycollation
hacerlas en mysql?En Fedora 21
Añadir seguimiento:
Guardar y Salir.
Final recuerde reiniciar el servicio mysqld con
service mysqld restart
.fuente
MySQL 5.5, todo lo que necesitas es:
collation_server
es opcional.fuente
Si tiene problemas para confirmar la compatibilidad del juego 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 juego de caracteres del cliente en utf8. Cambiar manualmente el conjunto de caracteres del cliente, como usar 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 juegos de caracteres de MySQL Workbench con los cambios de my.cnf. por ejemplo, 'establecer nombres utf8mb4'
fuente
Si su configuración para el cliente le confunde y conn se restablece después de reiniciar el servicio mysql. Pruebe estos pasos (que funcionaron para mí):
vi /etc/my.cnf
:wq [client] character-sets-dir=/usr/local/mysql/share/mysql/charsets
status;
, encontrará el conjunto de caracteres para 'cliente' y 'conn' está configurado como 'utf8'.Consulte la referencia para más información.
fuente
Puede hacerlo de la manera que lo hace, y si no funciona, debe reiniciar mysql.
fuente
Cambiar el carácter MySQL:
Cliente
mysqld
No deberíamos escribir
default-character-set=utf8
en mysqld, porque eso podría provocar un error como:Al final:
fuente