Définissez la valeur de character_set_client sur utf8mb4

12

J'essaie de convertir ma base de données en utf8mb4suivant 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_clientet character_set_resultsne 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?

qwaz
la source

Réponses:

14

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ù se mysqldcharge 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é mysqlden exécutant mysqld restartaprès avoir apporté les modifications?

Mathias Bynens
la source
1. J'ai enregistré les modifications dans \xampp\mysql\bin\my.ini. Je n'ai pas pu exécuter mysqld --help --verbose 2> /dev/null | grep -A1 'Default options'- car cela donne l'erreur suivante: 'grep' is not recognized as an internal or external command, operable program or batch file.je suis nouveau dans ce genre de choses, donc je peux faire quelque chose de mal.
qwaz
2. J'ai redémarré mysqld et après cela, je reçois les avertissements suivants: 2014-02-19 10:25:17 0 [Avertissement] L'utilisation du préfixe d'option unique character_set_client au lieu de character-set-client-handshake est déconseillée et sera supprimée dans une future version. Veuillez utiliser le nom complet à la place. 2014-02-19 10:25:17 0 [Avertissement] mysqld: ignorer l'option '--character-set-client-handshake' en raison d'une valeur invalide 'utf8mb4'
qwaz
1
Pourquoi avez-vous skip-character-set-client-handshakedans votre fichier de configuration? C'est une option de ligne de commande, pas une variable.
Mathias Bynens
1
J'ai dû réinstaller le serveur local; parcouru à nouveau votre guide et tout a fonctionné. J'apprécie votre réponse et votre aide. Je reviendrai sur votre réponse et la voterai dès que j'aurai suffisamment de représentants pour le faire.
qwaz
3
J'ai essayé cela , mais encore character_set_client, character_set_connection, character_set_results, collation_connectionest présentée comme utf8. Des idées pourquoi cela ne fonctionne pas?
Sarita
2

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 telle qu'elle prend DEFAULT CHARACTERcomme argument et si cela n'est pas transmis pendant l'exécution, un jeu de caractères par défaut est transmis, ce qui n'est pas le cas utfmb4.

Voici les étapes que j'ai suivies pour y remédier:

  1. Créez une base de données factice avec un utf8mb4jeu 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 un client java 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
Obi Wan - PallavJha
la source