it-swarm.com.de

Setzen Sie den Wert von character_set_client auf utf8mb4

Ich versuche, meine Datenbank nach dieser Anleitung in utf8mb4 Zu konvertieren. Ich habe gesetzt:

[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

Der Wert von character_set_client Und character_set_results Wird jedoch immer noch nicht in utf8mb4 geändert.

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 |
+--------------------------+--------------------+

Was mache ich falsch? Wie kann ich diese Werte auf utf8mb4 setzen?

12
qwaz

Offenlegung: Ich bin der Autor von nterstützung von vollständigem Unicode in MySQL-Datenbanken , dem Handbuch, dem Sie folgen.

  1. Wo haben Sie die geänderten Einstellungen gespeichert? Überprüfen Sie, woher mysqld die Standardoptionen lädt. Es ist normalerweise /etc/my.cnf ( wie in der Anleitung erwähnt ), aber es kann auf Ihrem System anders sein. Führen Sie den folgenden Befehl aus, um dies herauszufinden:

    $ 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. Haben Sie mysqld neu gestartet, indem Sie mysqld restart nach den Änderungen?

14
Mathias Bynens

Ich habe diesen Leitfaden auch befolgt, aber das gleiche Problem trat erneut auf. Das eigentliche Problem liegt in dem Befehl, der zum Erstellen der Datenbank verwendet wird, da DEFAULT CHARACTER Als Argument verwendet wird. Wenn dies während der Ausführung nicht übergeben wird, wird ein Standardzeichensatz übergeben, der nicht utfmb4 Ist.

Im Folgenden sind die Schritte aufgeführt, die ich zur Behebung des Problems ausgeführt habe:

  1. Erstellen Sie eine Dummy-Datenbank mit dem Zeichensatz utf8mb4.

    create database `your_db_name_dummy`
      DEFAULT CHARACTER SET utf8mb4
      DEFAULT COLLATE utf8mb4_unicode_ci;
    
  2. Kopieren Sie die tatsächliche Struktur und die Daten aus der tatsächlichen Datenbank in diese Dummy-Datenbank

    mysqldump -uroot -proot_password your_db_name | mysql -uroot -proot_password your_db_name_dummy

  3. Aktuelle Datenbank löschen

    SET FOREIGN_KEY_CHECKS=0;
    DROP DATABASE your_db_name;
    
  4. Neue Datenbank erstellen

    create database `your_db_name`
      DEFAULT CHARACTER SET utf8mb4
      DEFAULT COLLATE utf8mb4_unicode_ci;
    
  5. Legen Sie abschließend die Tabellenstruktur und die Daten wieder in der ursprünglichen Datenbank ab

    mysqldump -uroot -proot_password your_db_name_dummy | mysql -uroot -proot_password your_db_name

Wenn Sie das oben genannte Verfahren anwenden möchten, lesen Sie bitte auch die unten genannten Zeilen sorgfältig durch.

Voraussetzungen und mein Status quo:

  • Sichern Sie alle Ihre Strukturen, Daten, gespeicherten Prozeduren, Funktionen, Trigger usw.
  • mysql --version Mysql Ver 14.14 Distrib 5.7.22 für Linux (x86_64) mit EditLine-Wrapper

  • 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
    
  • Ich verwende Java Client, der 'mysql:mysql-connector-Java:5.1.30' Ist.

  • Meine Verbindungszeichenfolge ist jdbc:mysql://ip.of.database:3306/your_db_name?zeroDateTimeBehavior=convertToNull&noAccessToProcedureBodies=true&autoReconnect=true
2