Ubah karakter default MySQL yang diatur ke UTF-8 di my.cnf?

334

Saat ini kami menggunakan perintah berikut dalam PHP untuk mengatur set karakter ke UTF-8 di aplikasi kami.

Karena ini sedikit overhead, kami ingin menetapkan ini sebagai pengaturan default di MySQL. Bisakah kita melakukan ini di /etc/my.cnf atau di lokasi lain?

SET NAMES 'utf8'
SET CHARACTER SET utf8

Saya telah mencari charset default di /etc/my.cnf, tetapi tidak ada yang tentang charset di sana.

Pada titik ini, saya melakukan hal berikut untuk mengatur variabel charset dan collation MySQL ke UTF-8:

skip-character-set-client-handshake
character_set_client=utf8
character_set_server=utf8

Apakah itu cara yang benar untuk menangani ini?

Jorre
sumber
19
Perhatikan bahwa standar yang lebih baik adalah utf8mb4, yaitu UTF-8 nyata dengan dukungan Unicode penuh. Lihat Cara mendukung Unicode penuh dalam database MySQL .
Mathias Bynens
@Jorre, apakah Anda keberatan mengubah ini menjadi utf8mb4jenis pengaturan preseden berbahaya saat ini duduk?
Evan Carroll

Jawaban:

424

Untuk mengatur default ke UTF-8, Anda ingin menambahkan yang berikut ke my.cnf

[client]
default-character-set=utf8

[mysql]
default-character-set=utf8


[mysqld]
collation-server = utf8_unicode_ci
init-connect='SET NAMES utf8'
character-set-server = utf8

Jika Anda ingin mengubah set karakter untuk DB yang ada, beri tahu saya ... pertanyaan Anda tidak menentukan secara langsung jadi saya tidak yakin apakah itu yang ingin Anda lakukan.

NinjaCat
sumber
18
Pengaturan my.cnf di atas juga berfungsi untuk saya. Selain itu, saya harus memastikan bahwa tabel telah diatur dengan benar, seperti ALTER TABLE TableCONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
Chris Livdahl
8
Tidak berfungsi untuk mysql 5.5. Saya menggunakan: <br/> [mysqld] # Perubahan utf-8 collation-server = utf8mb4_unicode_ci init-connect = 'SET NAMES utf8mb4' karakter-set-server = utf8mb4 dan utf8mb4 di tempat lain seperti disebutkan di atas.
Juara
12
Di Ubuntu 12.04, ini bekerja untuk saya - jika saya menghapus baris pertama setelahnya [mysqld].
Brandon Bertelsen
4
Sepertinya default-karakter-set tidak lagi diizinkan di bagian [mysqld]
marsbard
4
Perhatikan bahwa jika Anda ingin UTF-8, jangan gunakan utf8charset MySQL . Gunakan utf8mb4sebagai gantinya.
Mathias Bynens
255

Untuk versi terbaru MySQL,

default-character-set = utf8

menyebabkan masalah. Sudah usang saya pikir.

Seperti yang dikatakan Justin Ball dalam " Tingkatkan ke MySQL 5.5.12 dan sekarang MySQL tidak akan mulai , Anda harus:

  1. Hapus arahan itu dan Anda harus baik.

  2. Maka file konfigurasi Anda ('/ etc / my.cnf' misalnya) akan terlihat seperti itu:

    [mysqld]
    collation-server = utf8_unicode_ci
    init-connect='SET NAMES utf8'
    character-set-server = utf8
  3. Mulai ulang MySQL.

  4. Untuk memastikan, MySQL Anda adalah UTF-8, jalankan query berikut di prompt MySQL Anda:

    • Kueri pertama:

       mysql> show variables like 'char%';

      Outputnya akan terlihat seperti:

       +--------------------------+---------------------------------+
       | Variable_name            | Value                           |
       +--------------------------+---------------------------------+
       | character_set_client     | utf8                            |
       | character_set_connection | utf8                            |
       | character_set_database   | utf8                            |
       | character_set_filesystem | binary                          |
       | character_set_results    | utf8                            |
       | character_set_server     | utf8                            |
       | character_set_system     | utf8                            |
       | character_sets_dir       | /usr/local/mysql/share/charsets/|
       +--------------------------+---------------------------------+
    • Kueri kedua:

       mysql> show variables like 'collation%';

      Dan output permintaan adalah:

       +----------------------+-----------------+
       | Variable_name        | Value           |
       +----------------------+-----------------+
       | collation_connection | utf8_general_ci |
       | collation_database   | utf8_unicode_ci |
       | collation_server     | utf8_unicode_ci |
       +----------------------+-----------------+
Mustafah
sumber
Apakah baris pertama Anda max_allowed_packet = 64M terkait dengan masalah UTF8 ini?
Malhal
Saya punya character_set_filesystem | utf8. Saya tidak yakin, tidak apa-apa?
paman Lem
1
Sudah mencoba MariaDB v5.5 dan berhasil, terima kasih! mysql Ver 15.1 Distrib 5.5.35-MariaDB, for debian-linux-gnu (x86_64) using readline 5.1
cenk
Saya pikir Anda tidak perlu menghapus default-character-set, sebaliknya Anda dapat mengubah ke loose-default-character-set = utf8- yaitu, awalan dengan 'longgar-'. Ini membuat mysqlbinlogsenang, jika Anda perlu menggunakannya - google untuk: "longgar-default-karakter-set" mysqlbinlog .
KajMagnus
Apakah init-connect='SET NAMES utf8'benar-benar perlu? Jika tidak, kita pasti bisa melakukannya tanpa kinerja.
datan.io
56

Pertanyaan ini sudah memiliki banyak jawaban, tetapi Mathias Bynens menyebutkan bahwa 'utf8mb4' harus digunakan alih-alih 'utf8' agar mendapat dukungan UTF-8 yang lebih baik ('utf8' tidak mendukung karakter 4 byte, bidang terpotong saat disisipkan ). Saya menganggap ini sebagai perbedaan penting. Jadi di sini ada jawaban lain tentang cara mengatur set karakter standar dan pemeriksaan. Yang memungkinkan Anda untuk memasukkan tumpukan kotoran (💩).

Ini berfungsi pada MySQL 5.5.35.

Perhatikan, bahwa beberapa pengaturan mungkin opsional. Karena saya tidak sepenuhnya yakin bahwa saya belum melupakan apa pun, saya akan menjadikan ini sebagai wiki komunitas

Pengaturan Lama

mysql> SHOW VARIABLES LIKE 'char%'; SHOW VARIABLES LIKE 'collation%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

+----------------------+-------------------+
| Variable_name        | Value             |
+----------------------+-------------------+
| collation_connection | utf8_general_ci   |
| collation_database   | latin1_swedish_ci |
| collation_server     | latin1_swedish_ci |
+----------------------+-------------------+
3 rows in set (0.00 sec)

Konfigurasi

# 💩 𝌆
# UTF-8 should be used instead of Latin1. Obviously.
# NOTE "utf8" in MySQL is NOT full UTF-8: http://mathiasbynens.be/notes/mysql-utf8mb4

[client]
default-character-set = utf8mb4

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

[mysql]
default-character-set = utf8mb4

Pengaturan Baru

mysql> SHOW VARIABLES LIKE 'char%'; SHOW VARIABLES LIKE 'collation%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8mb4                    |
| character_set_connection | utf8mb4                    |
| character_set_database   | utf8mb4                    |
| character_set_filesystem | binary                     |
| character_set_results    | utf8mb4                    |
| character_set_server     | utf8mb4                    |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

+----------------------+--------------------+
| Variable_name        | Value              |
+----------------------+--------------------+
| collation_connection | utf8mb4_general_ci |
| collation_database   | utf8mb4_unicode_ci |
| collation_server     | utf8mb4_unicode_ci |
+----------------------+--------------------+
3 rows in set (0.00 sec)

character_set_system selalu utf8 .

Ini tidak akan mempengaruhi tabel yang ada, itu hanya pengaturan default (digunakan untuk tabel baru). Kode ALTER berikut dapat digunakan untuk mengonversi tabel yang ada (tanpa penyelesaian dump-restore):

ALTER DATABASE databasename CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Edit:

Pada server MySQL 5.0: character_set_client, character_set_connection, character_set_result, collation_connection tetap di latin1. Penerbitan SET NAMES utf8(utf8mb4 tidak tersedia dalam versi itu) mengatur mereka juga untuk utf8.


Peringatan : Jika Anda memiliki tabel utf8 dengan kolom indeks tipe VARCHAR (255), dalam beberapa kasus tidak dapat dikonversi, karena panjang kunci maksimum terlampaui ( Specified key was too long; max key length is 767 bytes.). Jika memungkinkan, kurangi ukuran kolom dari 255 menjadi 191 (karena 191 * 4 = 764 <767 <192 * 4 = 768). Setelah itu, tabel dapat dikonversi.

basic6
sumber
Saya mengikuti pengaturan Anda, tetapi saya menemukan character_set_databasemasih utf8dan collation_databaseutf8_bin`. Apakah saya melewatkan sesuatu?
Stewart
Menemukan apa yang saya lewatkan. 2 pengaturan tersebut diatur ketika database itu sendiri dibuat. Lihat pertanyaan ini; stackoverflow.com/questions/22572558/…
Stewart
1
tambahkan character-set-client-handshake = FALSEke bagian [mysqld], jadi itu akan selalu menggunakan pengodean default bahkan jika Anda akan membuat kesalahan pada lapisan aplikasi
Lukas Liesis
hai Saya sudah mencoba solusi ini tetapi tetap saja saya tidak dapat menampilkan character_set_client | utf8mb4. itu utf8. hanya character_set_database utf8mb4 dan character_set_server utf8mb4 yang utf8mb4 lainnya tidak berubah. Tolong bantu saya
Bhavin Chauhan
@ baic6 Saya sarankan menambahkan catatan yang menjelaskan mengapa hanya kolom yang diindeks yang dapat menyebabkan masalah. Batasan 767 byte hanya untuk kolom yang diindeks, karena batasan untuk "kunci". Untuk kolom yang tidak diindekskan secara umum, ini tidak berlaku. Jika sebuah kolom memiliki nilai dengan panjang byte maks, katakanlah 255 karakter dan maks 3 byte utf8 digunakan, itu masih akan membutuhkan hanya 255 * 3 byte, utf8mb4 dalam kasus ini hanya akan menggunakan 3-byte, karena karakter ini dalam utf8mb4 juga hanya membutuhkan 3 byte. Yaitu, kecuali karakter yang tidak cocok dengan utf8 disimpan ke dalam kolom di mana info tersebut sudah hilang.
sam
55

Pada MySQL 5.5 yang saya miliki di my.cnf

[mysqld] 
init_connect='SET collation_connection = utf8_unicode_ci' 
init_connect='SET NAMES utf8' 
character-set-server=utf8 
collation-server=utf8_unicode_ci 
skip-character-set-client-handshake

Hasilnya adalah

mysql> show variables like "%character%";show variables like "%collation%";

+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_unicode_ci |
| collation_database   | utf8_unicode_ci |
| collation_server     | utf8_unicode_ci |
+----------------------+-----------------+
3 rows in set (0.00 sec)
Tomazzlender
sumber
2
Apa yang skip-character-set-client-handshakedilakukan dengan tepat dan dalam kondisi apa diperlukan?
Simon East
3
@Simon, ketika menggunakan show variables like "%collation%";saya melihat 'collation_connection' sebagai utf8_general_cidan collation_database dan collation_server sebagai utf8_unicode_ci. Menambahkan baris skip-character-set-client-handshakemengubah entri umum menjadi unicode, sehingga ketiganya konsisten.
Vaughany
2
Pada MySQL 5.6, skip-character-set-client-handshake tidak melakukan apa yang dikatakan @Vaughany. Ada saran?
Ababneh A
4
Itu skip-character-set-client-handshakemelakukannya untuk saya (bersama dengan "character-set-server" dan "collation-server", tentu saja - pada Debian 7). The init_connects tidak membuat perbedaan dengan atau tanpa skipdan tampak berlebihan. +1 dan terima kasih.
Jeff
3
skip-character-set-client-handshake mengabaikan informasi set karakter yang dikirim oleh klien. Ini bagus untuk memaksa set karakter tertentu selama komunikasi, tetapi jika klien mengharapkan sesuatu yang lain, itu dapat menyebabkan masalah. Saya akan mengatakan Anda lebih baik menentukan ini pada klien (aplikasi Anda).
0b10011
31

catatan: file my.cnf terletak di/etc/mysql/

Setelah menambahkan baris ini:

[mysqld]
collation-server = utf8_unicode_ci
init-connect='SET NAMES utf8'
character-set-server = utf8
skip-character-set-client-handshake

[client]
default-character-set   = utf8

[mysql]
default-character-set   = utf8

Jangan lupa me-restart server:

sudo service mysql restart
М.Б.
sumber
2
Catatan: Ini mengubah default; itu tidak mengubah pengkodean untuk kolom yang ada.
Rick James
24

NijaCat sudah dekat, tetapi ditentukan secara berlebihan:

Untuk mengatur default ke UTF-8, Anda ingin menambahkan yang berikut ke my.cnf

[client]
default-character-set=utf8

[mysqld]
default-character-set = utf8

Kemudian, untuk memverifikasi:

mysql> show variables like "%character%";show variables like "%collation%";

+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database   | utf8_general_ci |
| collation_server     | utf8_general_ci |
+----------------------+-----------------+
3 rows in set (0.00 sec)
Derek
sumber
5
Jawaban bagus. Mungkin penjelasan singkat tentang bagian mana yang berlebihan akan membantu orang memutuskan dengan tepat apa yang mereka inginkan dalam konfigurasi mereka.
Mike Samuel
@ Serek, lalu apa fungsinya [mysql] default-character-set=utf8?
Pacerier
1
Grup opsi [klien] sudah menetapkan opsi untuk semua klien MySQL yang membaca file my.cnf. Grup [mysql] menetapkan opsi hanya untuk biner klien "mysql", khususnya. Jika Anda ingin menetapkan opsi mysql yang tidak berlaku untuk klien lain, menggunakan grup ini adalah tepat, tetapi pengaturan nilai opsi yang sama di kedua lokasi adalah berlebihan. dev.mysql.com/doc/refman/5.6/en/option-files.html
Derek
@ Mike Samuel, pengaturan karakter default yang diatur ke utf8 sudah berarti mode collation default utf8_general_ci. Di sisi lain, "init-connect = 'SET NAMES utf8'" adalah ide yang agak menarik, karena ia mencoba untuk memaksa semua klien yang terhubung ke server untuk menggunakan utf8, tetapi ini diterapkan secara tidak konsisten tergantung pada hak istimewa koneksi dari koneksi yang menghubungkan pengguna dan saya menduga bahwa beberapa klien pihak ketiga yang terhubung mungkin bingung ketika server menimpa charset yang mereka minta. dev.mysql.com/doc/refman/5.6/en/charset-applications.html
Derek
Untuk [mysqld]digunakan character-set-serversebagai gantidefault-character-set
Rick James
23

Saya juga telah mengetahui bahwa setelah pengaturan di default-character-set = utf8bawah [mysqld]judul, MySQL 5.5.x tidak akan mulai di bawah Ubuntu 12.04 (Precise Pangolin).

amiroff
sumber
16
Itu bug MySQL # 52047 . Di bawah [mysqld], Anda harus menggunakan character-set-serverbukan default-character-set. (Sangat membingungkan, saya setuju!)
Mathias Bynens
Iya. Tidak digunakan lagi di 5.0; dihapus di 5.5.
Rick James
22

MySQL v5.5.3 dan lebih tinggi:

Cukup tambahkan tiga baris saja di bagian [mysqld]:

[mysqld]
character-set-server = utf8
collation-server = utf8_unicode_ci
skip-character-set-client-handshake

Catatan: Termasuk skip-character-set-client-handshakedi sini menyingkirkan kebutuhan untuk menyertakan kedua init-connectdi [mysqld]dan default-character-setdi [client]dan [mysql]bagian.

mug896
sumber
1
Wow, begitu banyak jawaban duplikat untuk pertanyaan ini, namun ini tampaknya yang paling sederhana. Juga berfungsi untuk saya di v5.5.44.
Justin Watt
9

Di bawah Xubuntu 12.04 saya cukup menambahkan

[mysqld]
character_set_server = utf8

ke /etc/mysql/my.cnf

Dan hasilnya

mysql> show variables like "%character%";show variables like "%collation%";
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database   | utf8_general_ci |
| collation_server     | utf8_general_ci |
+----------------------+-----------------+
3 rows in set (0.00 sec)

Juga lihat di http://dev.mysql.com/doc/refman/5.6/en/charset-server.html

Falko
sumber
Anda juga memerlukan [client] default-character-set = utf8 sebaliknya saat Anda menggunakan mysql pada baris perintah, itu tidak akan menggunakan utf8 yang berpotensi menghancurkan cadangan yang Anda pipakan ke file.
Malhal
9

Semua pengaturan yang tercantum di sini benar, tetapi di sini adalah solusi yang paling optimal dan memadai:

[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
character-set-server = utf8
collation-server = utf8_unicode_ci

[client]
default-character-set = utf8

Tambahkan ini ke /etc/mysql/my.cnf .

Harap dicatat, saya memilih utf8_unicode_ci jenis pemeriksaan karena masalah kinerja.

Hasilnya adalah:

mysql> SHOW VARIABLES LIKE 'character%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

mysql> SHOW VARIABLES LIKE 'collation%';
+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_unicode_ci |
| collation_database   | utf8_unicode_ci |
| collation_server     | utf8_unicode_ci |
+----------------------+-----------------+

Dan ini adalah saat Anda terhubung sebagai pengguna non-SUPER !

Misalnya, perbedaan antara koneksi sebagai pengguna SUPER dan non-SUPER (tentu saja dalam kasus utf8_unicode_ci collation ):

pengguna dengan SUPER priv .:

mysql> SHOW VARIABLES LIKE 'collation%';
+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_general_ci | <---
| collation_database   | utf8_unicode_ci |
| collation_server     | utf8_unicode_ci |
+----------------------+-----------------+

pengguna dengan non-SUPER priv .:

mysql> SHOW VARIABLES LIKE 'collation%';
+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_unicode_ci |
| collation_database   | utf8_unicode_ci |
| collation_server     | utf8_unicode_ci |
+----------------------+-----------------+

Saya menulis artikel komprehensif (rus) yang menjelaskan secara terperinci mengapa Anda harus menggunakan satu atau opsi lainnya. Semua jenis Set Karakter dan Collations dianggap: untuk server, database, untuk koneksi, untuk meja dan bahkan untuk kolom.

Saya harap ini dan artikel ini akan membantu memperjelas momen yang tidak jelas.

gahcep
sumber
3
Saya berharap saya bisa membaca artikel Anda yang ditautkan, tetapi tidak dapat membaca terjemahan bahasa Rusia dan Google tidak terlalu membantu untuk teks teknis. Dari apa yang saya tahu meskipun itu akan sangat menarik. Apakah Anda ingin memposting versi bahasa Inggris?
Martijn Heemels
2
Bisakah Anda menjelaskan pengaturan mana yang gagal mengatur susunan koneksi pengguna SUPER? (dan apakah ada solusinya)
KCD
@ gahcep, Anda menyatakan Anda menggunakan utf8_unicode_cikarena masalah kinerja, lalu, mengapa tidak menggunakannya utf8_bin?
Pacerier
Hai, Paceriar. Poin yang bagus. Sekarang saya tidak yakin apakah pilihan saya benar tentang menggunakan utf8_unicode_cisama sekali. Tidak pernah menghabiskan waktu menguji kinerja.
gahcep
4

Versi MySQL dan distribusi Linux mungkin penting saat membuat konfigurasi.

Namun, perubahan dalam [mysqld]bagian ini dianjurkan.

Saya ingin memberikan penjelasan singkat tentang jawaban tomazzlender:

[mysqld] 
init_connect='SET collation_connection = utf8_unicode_ci' 
init_connect='SET NAMES utf8' 
character-set-server=utf8 
collation-server=utf8_unicode_ci 
skip-character-set-client-handshake

[mysqld]

Ini akan mengubah collation_connection menjadi utf8_unicode_ci

init_connect='SET collation_connection = utf8_unicode_ci'

Menggunakan SET NAMES:

init_connect='SET NAMES utf8'

SET NAMES akan memengaruhi tiga karakter, yaitu:

character_set_client
character_set_results
character_set_connection

Ini akan diatur character_set_database & character_set_server

character-set-server=utf8

Ini hanya akan memengaruhi collation_database & collation_server

collation-server=utf8_unicode_ci

Maaf, saya tidak begitu yakin untuk apa ini. Namun saya tidak menggunakannya:

skip-character-set-client-handshake
Lihang Li
sumber
The dokumentasi catatan yang character_set_servertidak harus diatur secara manual.
Brian
Jadi apa pendekatan mutakhir? Kami dapat secara eksplisit melewatkan character setsaat membuat koneksi database, namun terlihat sedikit menjengkelkan.
Lihang Li
Sebenarnya saya melakukan kesalahan. Dokumentasi mengatakan character_set_database tidak boleh diatur secara dinamis. Tidak menyebutkan character_set_server. Namun, saya tidak yakin Anda perlu khawatir tentang character_set_server, karena saya pikir itu hanya mempengaruhi nilai default untuk database yang baru dibuat?
Brian
Seperti yang saya sebutkan di atas dan saya melakukan percobaan lagi sekarang, character_set_serverpada [mysqld]bagian akan mempengaruhi character_set_databasedan character_set_server. Sekarang saya pikir praktik yang baik adalah dengan secara eksplisit menunjukkan character setyang ingin Anda gunakan saat membuat basis data, tabel dan koneksi basis data. Jujur berbicara, dokumentasi mysqltidak begitu mudah dipahami. Apakah Anda tahu jika ada cara umum untuk menyelesaikan semua character setdan collationpengaturan di mysql?
Lihang Li
4

Pada Fedora 21

$ vi /etc/my.cnf

Tambahkan ikuti:

[client]
default-character-set=utf8

[mysql]
default-character-set=utf8

[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci 
skip-character-set-client-handshake

Simpan dan keluar.

Final ingat restart layanan mysqld dengan service mysqld restart.

Nguyễn Văn Tiến
sumber
1

MySQL 5.5, yang Anda butuhkan adalah:

[mysqld]
character_set_client=utf8
character_set_server=utf8
collation_server=utf8_unicode_ci

collation_server adalah opsional.

mysql> show variables like 'char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
Gajus
sumber
1

Jika Anda mengalami kesulitan untuk mengkonfirmasi dukungan set karakter klien menggunakan MySQL Workbench, maka ingatlah catatan berikut:

Penting Semua koneksi yang dibuka oleh MySQL Workbench secara otomatis mengatur karakter klien yang ditetapkan ke utf8. Mengubah set karakter klien secara manual, seperti menggunakan SET NAMES ..., dapat menyebabkan MySQL Workbench tidak menampilkan karakter dengan benar. Untuk informasi tambahan tentang set karakter klien, lihat Kumpulan dan Koneksi Karakter.

Jadi saya tidak bisa menimpa set karakter MySQL Workbench dengan perubahan my.cnf. mis. 'set names utf8mb4'

paiego
sumber
1

Jika Anda bingung dengan pengaturan Anda untuk klien dan samb diatur ulang setelah me-restart layanan mysql. Coba langkah-langkah ini (yang cocok untuk saya):

  1. vi /etc/my.cnf
  2. tambahkan isi blow dan :wq [client] character-sets-dir=/usr/local/mysql/share/mysql/charsets
  3. restart mysql dan login mysql, gunakan database, perintah input status;, Anda akan menemukan set karakter untuk 'klien' dan 'samb' diatur ke 'utf8'.

Periksa referensi untuk info lebih lanjut.

John Wen
sumber
0

Anda dapat melakukannya dengan cara yang sama, dan jika itu tidak berhasil, Anda perlu me-restart mysql.

郭浩伟
sumber
-1

Ubah karakter MySQL:

Klien

default-character-set=utf8

mysqld

character_set_server=utf8

Kita tidak boleh menulis default-character-set=utf8di mysqld, karena itu bisa mengakibatkan kesalahan seperti:

mulai: Pekerjaan gagal memulai

Akhirnya:

 +--------------------------+----------------------------+
 | Variable_name            | Value                      |
 +--------------------------+----------------------------+
 | character_set_client     | utf8                       |
 | character_set_connection | utf8                       |
 | character_set_database   | utf8                       |
 | character_set_filesystem | binary                     |
 | character_set_results    | utf8                       |
 | character_set_server     | utf8                       |
 | character_set_system     | utf8                       |
 | character_sets_dir       | /usr/share/mysql/charsets/ |
 +--------------------------+----------------------------+
MYLOGOS
sumber