Tetapkan nilai character_set_client ke utf8mb4

12

Saya mencoba mengonversi DB saya untuk utf8mb4mengikuti panduan ini . Saya telah menetapkan:

[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

Tetapi nilai character_set_clientdan character_set_resultsmasih tidak akan berubah menjadi 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 |
+--------------------------+--------------------+

Apa yang saya lakukan salah? Bagaimana cara mengatur nilai-nilai itu ke utf8mb4?

qwaz
sumber

Jawaban:

14

Pengungkapan: Saya penulis Cara mendukung Unicode penuh dalam database MySQL , panduan yang Anda ikuti.

  1. Di mana Anda menyimpan pengaturan yang diubah? Periksa dari mana mysqldmemuat opsi default. Biasanya /etc/my.cnf( seperti disebutkan dalam panduan ) tetapi mungkin berbeda pada sistem Anda. Jalankan perintah berikut untuk mencari tahu:

    $ 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. Apakah Anda memulai kembali mysqlddengan menjalankan mysqld restartsetelah melakukan perubahan?

Mathias Bynens
sumber
1. Saya menyimpan perubahan \xampp\mysql\bin\my.ini. Saya tidak dapat menjalankan mysqld --help --verbose 2> /dev/null | grep -A1 'Default options'- karena memberikan kesalahan berikut: 'grep' is not recognized as an internal or external command, operable program or batch file.Saya baru dalam hal ini, jadi saya mungkin melakukan sesuatu yang salah.
qwaz
2. Saya memulai ulang mysqld, dan setelah itu memberi saya peringatan berikut: 2014-02-19 10:25:17 0 [Peringatan] Menggunakan awalan opsi unik character_set_client bukan karakter-set-klien-jabat tangan sudah usang dan akan dihapus dalam rilis mendatang. Silakan gunakan nama lengkap saja. 2014-02-19 10:25:17 0 [Peringatan] mysqld: mengabaikan opsi '--character-set-client-handshake' karena nilai yang tidak valid 'utf8mb4'
qwaz
1
Mengapa Anda ada skip-character-set-client-handshakedi file konfigurasi Anda? Ini adalah opsi baris perintah, bukan variabel.
Mathias Bynens
1
Saya harus menginstal ulang server lokal; berjalan melalui pemandu Anda lagi dan semuanya berhasil. Saya menghargai tanggapan dan bantuan Anda. Saya akan kembali ke jawaban Anda dan membenarkannya segera setelah saya memiliki cukup repetisi untuk melakukannya.
qwaz
3
Saya mencoba ini, tetapi masih character_set_client, character_set_connection, character_set_results, collation_connectionditampilkan sebagai utf8. Adakah ide mengapa ini tidak berhasil?
Sarita
2

Saya juga mengikuti panduan itu, namun masalah yang sama muncul lagi. Masalah sebenarnya terletak pada perintah yang digunakan untuk membuat DB karena dibutuhkan DEFAULT CHARACTERsebagai argumen dan jika itu tidak lulus saat eksekusi set karakter default dilewatkan yang tidak utfmb4.

Berikut adalah langkah-langkah yang saya ikuti untuk memperbaikinya:

  1. Buat database dummy dengan utf8mb4set karakter.

    create database `your_db_name_dummy`
      DEFAULT CHARACTER SET utf8mb4
      DEFAULT COLLATE utf8mb4_unicode_ci;
  2. Salin struktur dan data aktual ke basis data dummy ini dari basis data aktual

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

  3. Jatuhkan basis data saat ini

    SET FOREIGN_KEY_CHECKS=0;
    DROP DATABASE your_db_name;
  4. Buat database baru

    create database `your_db_name`
      DEFAULT CHARACTER SET utf8mb4
      DEFAULT COLLATE utf8mb4_unicode_ci;
  5. Akhirnya, kembalikan struktur tabel dan data ke database asli

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

Jika Anda akan menggunakan prosedur yang disebutkan di atas maka pastikan untuk membaca dengan seksama baris yang disebutkan di bawah ini juga.

Prasyarat dan status quo saya:

  • Cadangkan semua struktur, data, prosedur tersimpan, fungsi, pemicu, dll.
  • mysql --version mysql Ver 14.14 Distrib 5.7.22, untuk Linux (x86_64) menggunakan 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
  • Saya menggunakan klien java yang 'mysql:mysql-connector-java:5.1.30'

  • String koneksi saya adalah jdbc:mysql://ip.of.database:3306/your_db_name?zeroDateTimeBehavior=convertToNull&noAccessToProcedureBodies=true&autoReconnect=true
Obi Wan - PallavJha
sumber