web-dev-qa-db-fra.com

Définissez la valeur de character_set_client sur utf8mb4

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?

12
qwaz

Divulgation: Je suis l'auteur de Comment prendre en charge Unicode complet dans les bases de données MySQL , le guide que vous suivez.

  1. 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
    
  2. Avez-vous redémarré mysqld en exécutant mysqld restart après avoir apporté les modifications?

14
Mathias Bynens

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:

  1. 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;
    
  2. 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

  3. Supprimer la base de données actuelle

    SET FOREIGN_KEY_CHECKS=0;
    DROP DATABASE your_db_name;
    
  4. Créer une nouvelle base de données

    create database `your_db_name`
      DEFAULT CHARACTER SET utf8mb4
      DEFAULT COLLATE utf8mb4_unicode_ci;
    
  5. 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:

  • Sauvegardez toutes vos structures, données, procédures stockées, fonctions, déclencheurs, etc.
  • 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'

  • Ma chaîne de connexion est jdbc:mysql://ip.of.database:3306/your_db_name?zeroDateTimeBehavior=convertToNull&noAccessToProcedureBodies=true&autoReconnect=true
2