Impostare il valore di character_set_client su utf8mb4


12

Sto cercando di convertire il mio DB nel utf8mb4seguire questa guida . Ho impostato:

[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

Ma il valore di character_set_cliente character_set_resultsnon cambierà ancora in 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 |
+--------------------------+--------------------+

Che cosa sto facendo di sbagliato? Come ottengo quei valori impostati su utf8mb4?

Risposte:


14

Divulgazione: sono l'autore di Come supportare Unicode completo nei database MySQL , la guida che stai seguendo.

  1. Dove hai salvato le impostazioni modificate? Controlla da dove mysqldcarica le opzioni predefinite. Di solito è /etc/my.cnf( come menzionato nella guida ) ma potrebbe essere diverso sul tuo sistema. Esegui il comando seguente per scoprirlo:

    $ 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. Hai riavviato l' mysqldesecuzione mysqld restartdopo aver apportato le modifiche?


1. Ho salvato le modifiche in \xampp\mysql\bin\my.ini. Non sono riuscito a correre mysqld --help --verbose 2> /dev/null | grep -A1 'Default options', poiché mi dà il seguente errore: 'grep' is not recognized as an internal or external command, operable program or batch file.sono nuovo di queste cose, quindi potrei fare qualcosa di sbagliato.
qwaz,

2. Ho riavviato mysqld e dopo che mi ha dato i seguenti avvertimenti: 2014-02-19 10:25:17 0 [Avvertenza] L'uso del prefisso dell'opzione univoca character_set_client invece di character-set-client-handshake è obsoleto e verrà rimosso in una versione futura. Si prega di utilizzare il nome completo invece. 2014-02-19 10:25:17 0 [Avvertimento] mysqld: ignorando l'opzione '--character-set-client-handshake' a causa di un valore non valido 'utf8mb4'
qwaz

1
Perché hai skip-character-set-client-handshakenel tuo file di configurazione? È un'opzione della riga di comando, non una variabile.
Mathias Bynens,

1
Ho dovuto reinstallare il server locale; ho ripercorso la tua guida e tutto ha funzionato. Apprezzo la tua risposta e il tuo aiuto. Tornerò alla tua risposta e la voterò non appena avrò abbastanza ripetizioni per farlo.
qwaz,

3
Ho provato questo ma ancora character_set_client, character_set_connection, character_set_results, collation_connectionè indicata con utf8. Qualche idea sul perché questo non funziona?
Sarita,

2

Ho anche seguito quella guida, tuttavia, lo stesso problema è apparso di nuovo. Il vero problema risiede nel comando usato per creare il DB come serve DEFAULT CHARACTERcome argomento e se non viene passato durante l'esecuzione viene passato un set di caratteri predefinito che non lo è utfmb4.

Di seguito sono riportati i passaggi che ho seguito per risolverlo:

  1. Creare un database fittizio con utf8mb4set di caratteri.

    create database `your_db_name_dummy`
      DEFAULT CHARACTER SET utf8mb4
      DEFAULT COLLATE utf8mb4_unicode_ci;
  2. Copia la struttura e i dati effettivi su questo database fittizio dal database effettivo

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

  3. Elimina il database corrente

    SET FOREIGN_KEY_CHECKS=0;
    DROP DATABASE your_db_name;
  4. Crea un nuovo database

    create database `your_db_name`
      DEFAULT CHARACTER SET utf8mb4
      DEFAULT COLLATE utf8mb4_unicode_ci;
  5. Infine, rimetti la struttura della tabella e i dati nel database originale

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

Se hai intenzione di utilizzare la procedura sopra menzionata, assicurati di leggere attentamente anche le righe indicate di seguito.

Prerequisiti e il mio status quo:

  • Eseguire il backup di tutta la struttura, i dati, le procedure memorizzate, le funzioni, i trigger, ecc.
  • mysql --version mysql Ver 14.14 Distribuire 5.7.22, per Linux (x86_64) usando il 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
  • Sto usando il client Java che è 'mysql:mysql-connector-java:5.1.30'

  • La mia stringa di connessione è jdbc:mysql://ip.of.database:3306/your_db_name?zeroDateTimeBehavior=convertToNull&noAccessToProcedureBodies=true&autoReconnect=true
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.