Cette question a déjà beaucoup de réponses, mais Mathias Bynens a mentionné que 'utf8mb4' devrait être utilisé au lieu de 'utf8' afin d'avoir un meilleur support UTF-8 ('utf8' ne supporte pas les caractères de 4 octets, les champs sont tronqués lors de l'insertion ). Je considère que c'est une différence importante. Voici donc une autre réponse sur la façon de définir le jeu de caractères et le classement par défaut. Celui qui vous permettra d'insérer un tas de caca (💩).
Cela fonctionne sur MySQL 5.5.35.
Notez que certains paramètres peuvent être facultatifs. Comme je ne suis pas entièrement sûr de n'avoir rien oublié, je ferai de cette réponse un wiki communautaire.
Anciens paramètres
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
Nouveaux paramètres
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 est toujours utf8 .
Cela n'affectera pas les tables existantes, c'est juste le paramètre par défaut (utilisé pour les nouvelles tables). Le code ALTER suivant peut être utilisé pour convertir une table existante (sans la solution de contournement-restauration):
ALTER DATABASE databasename CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Éditer:
Sur un serveur MySQL 5.0: character_set_client, character_set_connection, character_set_results, collation_connection restent à latin1. L'émission SET NAMES utf8
(utf8mb4 n'est pas disponible dans cette version) les définit également sur utf8.
Avertissement : si vous aviez une table utf8 avec une colonne d'index de type VARCHAR (255), elle ne peut pas être convertie dans certains cas, car la longueur de clé maximale est dépassée ( Specified key was too long; max key length is 767 bytes.
). Si possible, réduisez la taille de la colonne de 255 à 191 (car 191 * 4 = 764 <767 <192 * 4 = 768). Après cela, le tableau peut être converti.
utf8mb4
, c'est-à-dire du vrai UTF-8 avec un support complet Unicode. Voir Comment prendre en charge Unicode complet dans les bases de données MySQL .