Setzen Sie den Wert von character_set_client auf utf8mb4

12

Ich versuche, meine Datenbank so zu konvertieren, dass sie diesem Handbuchutf8mb4 folgt . 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

Aber der Wert character_set_clientund character_set_resultswird nach wie vor nicht zu utf8mb4 ändern.

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?

qwaz
quelle

Antworten:

14

Offenlegung: Ich bin der Autor von How to Support Full Unicode in MySQL-Datenbanken , dem Handbuch, dem Sie folgen.

  1. Wo haben Sie die geänderten Einstellungen gespeichert? Überprüfen Sie, woher mysqlddie Standardoptionen geladen werden. 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 neu starten , mysqldindem Sie , mysqld restartnachdem Sie die Änderungen vorgenommen haben ?

Mathias Bynens
quelle
1. Ich habe Änderungen in gespeichert \xampp\mysql\bin\my.ini. Ich konnte nicht laufen, mysqld --help --verbose 2> /dev/null | grep -A1 'Default options'da es den folgenden Fehler gibt: 'grep' is not recognized as an internal or external command, operable program or batch file.Ich bin neu in diesem Zeug, also mache ich möglicherweise etwas falsch.
Qwaz
2. Ich habe mysqld neu gestartet und danach die folgenden Warnungen ausgegeben: 2014-02-19 10:25:17 0 [Warnung] Die Verwendung des eindeutigen Optionspräfixes charakter_set_client anstelle des Zeichensatz-Client-Handshakes ist veraltet und wird entfernt in einer zukünftigen Version. Bitte verwenden Sie stattdessen den vollständigen Namen. 2014-02-19 10:25:17 0 [Warnung] mysqld: Ignoriert die Option '--character-set-client-handshake' aufgrund des ungültigen Werts 'utf8mb4'
qwaz
1
Warum hast du skip-character-set-client-handshakein deiner Konfigurationsdatei? Es ist eine Befehlszeilenoption, keine Variable.
Mathias Bynens
1
Ich musste den lokalen Server neu installieren. ging wieder durch Ihren Führer und alles hat geklappt. Ich freue mich über Ihre Antwort und Ihre Hilfe. Ich werde auf Ihre Antwort zurückkommen und sie bewerten, sobald ich genug Wiederholungen habe, um dies zu tun.
Qwaz
3
Ich habe versucht , dies aber nach wie vor character_set_client, character_set_connection, character_set_results, collation_connectiongezeigt , wie utf8. Irgendwelche Ideen, warum das nicht funktioniert?
Sarita
2

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 als DEFAULT CHARACTERArgument verwendet wird. Wenn dieser während der Ausführung nicht übergeben wird, wird ein Standardzeichensatz übergeben, der nicht übergeben wird utfmb4.

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

  1. Erstellen Sie eine Dummy-Datenbank mit utf8mb4Zeichensatz.

    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 benutze Java-Client, das ist 'mysql:mysql-connector-java:5.1.30'

  • Meine Verbindungszeichenfolge ist jdbc:mysql://ip.of.database:3306/your_db_name?zeroDateTimeBehavior=convertToNull&noAccessToProcedureBodies=true&autoReconnect=true
Obi Wan - PallavJha
quelle