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
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 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):
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 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.
utf8mb4
, es decir, UTF-8 real con soporte completo de Unicode. Ver Cómo ayuda completa de Unicode en bases de datos MySQL .