J'essaie de convertir ma base de données en utf8mb4
suivant ce guide . J'ai mis:
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
[mysqld]
init-connect='SET NAMES utf8mb4'
collation_server=utf8mb4_unicode_ci
character_set_server=utf8mb4
skip-character-set-client-handshake
Mais la valeur de character_set_client
et character_set_results
ne changera toujours pas en utf8mb4.
mysql> SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';
+--------------------------+--------------------+
| Variable_name | Value |
+--------------------------+--------------------+
| character_set_client | utf8 |
| character_set_connection | utf8mb4 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8mb4 |
| character_set_system | utf8 |
| collation_connection | utf8mb4_unicode_ci |
| collation_database | utf8mb4_unicode_ci |
| collation_server | utf8mb4_unicode_ci |
+--------------------------+--------------------+
Qu'est-ce que je fais mal? Comment obtenir ces valeurs définies sur utf8mb4?
Divulgation: Je suis l'auteur de Comment prendre en charge Unicode complet dans les bases de données MySQL , le guide que vous suivez.
Où avez-vous enregistré les paramètres modifiés? Vérifiez d'où mysqld
charge les options par défaut. C'est généralement /etc/my.cnf
( comme mentionné dans le guide ) mais cela peut être différent sur votre système. Exécutez la commande suivante pour le découvrir:
$ mysqld --help --verbose 2> /dev/null | grep -A1 'Default options'
Default options are read from the following files in the given order:
/etc/my.cnf /etc/mysql/my.cnf /usr/local/etc/my.cnf ~/.my.cnf
Avez-vous redémarré mysqld
en exécutant mysqld restart
après avoir apporté les modifications?
J'ai également suivi ce guide, cependant, le même problème est apparu à nouveau. Le véritable problème réside dans la commande utilisée pour créer la base de données car elle prend DEFAULT CHARACTER
comme argument et si cela n'est pas passé pendant l'exécution, un jeu de caractères par défaut est passé qui n'est pas utfmb4
.
Voici les étapes que j'ai suivies pour y remédier:
Créez une base de données factice avec utf8mb4
jeu de caractères.
create database `your_db_name_dummy`
DEFAULT CHARACTER SET utf8mb4
DEFAULT COLLATE utf8mb4_unicode_ci;
Copiez la structure et les données réelles dans cette base de données factice à partir de la base de données réelle
mysqldump -uroot -proot_password your_db_name | mysql -uroot -proot_password your_db_name_dummy
Supprimer la base de données actuelle
SET FOREIGN_KEY_CHECKS=0;
DROP DATABASE your_db_name;
Créer une nouvelle base de données
create database `your_db_name`
DEFAULT CHARACTER SET utf8mb4
DEFAULT COLLATE utf8mb4_unicode_ci;
Enfin, remettez la structure de la table et les données dans la base de données d'origine
mysqldump -uroot -proot_password your_db_name_dummy | mysql -uroot -proot_password your_db_name
Si vous allez utiliser la procédure mentionnée ci-dessus, assurez-vous de lire attentivement les lignes ci-dessous également.
Prérequis et mon statu quo:
mysql --version
mysql Ver 14.14 Distrib 5.7.22, pour Linux (x86_64) utilisant le wrapper EditLine
cat /etc/my.cnf
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
init-connect = 'SET NAMES utf8mb4
collation-server = utf8mb4_unicode_ci
J'utilise Java client qui est 'mysql:mysql-connector-Java:5.1.30'
jdbc:mysql://ip.of.database:3306/your_db_name?zeroDateTimeBehavior=convertToNull&noAccessToProcedureBodies=true&autoReconnect=true