Pikirkan tentang itu:
- Anda menyimpan data dalam database sebagai
latin1
- Anda adalah data yang ditangani secara internal oleh mysqld as
latin1
Jika data berasal dari OS atau dari koneksi utf8
, bagaimana mysqld akan memperlakukannya?
Daripada menebak atau berharap yang terbaik, Anda bisa mengubah perilaku kumpulan karakter yang masuk. Dengan pengecualian information_schema
dan mysql
, ambil semua basis data Anda dan setel karakter default ke utf8
:
ALTER DATABASE dbname CHARACTER SET utf8;
Jika Anda memiliki warna tertentu untuk melakukannya, lakukan ini:
ALTER DATABASE dbname COLLATE 'utf8_general_ci';
Berikut adalah kumpulan yang dapat dipilih:
mysql> select * from information_schema.collations where CHARACTER_SET_NAME = 'utf8';
+--------------------+--------------------+-----+------------+-------------+---------+
| COLLATION_NAME | CHARACTER_SET_NAME | ID | IS_DEFAULT | IS_COMPILED | SORTLEN |
+--------------------+--------------------+-----+------------+-------------+---------+
| utf8_general_ci | utf8 | 33 | Yes | Yes | 1 |
| utf8_bin | utf8 | 83 | | Yes | 1 |
| utf8_unicode_ci | utf8 | 192 | | Yes | 8 |
| utf8_icelandic_ci | utf8 | 193 | | Yes | 8 |
| utf8_latvian_ci | utf8 | 194 | | Yes | 8 |
| utf8_romanian_ci | utf8 | 195 | | Yes | 8 |
| utf8_slovenian_ci | utf8 | 196 | | Yes | 8 |
| utf8_polish_ci | utf8 | 197 | | Yes | 8 |
| utf8_estonian_ci | utf8 | 198 | | Yes | 8 |
| utf8_spanish_ci | utf8 | 199 | | Yes | 8 |
| utf8_swedish_ci | utf8 | 200 | | Yes | 8 |
| utf8_turkish_ci | utf8 | 201 | | Yes | 8 |
| utf8_czech_ci | utf8 | 202 | | Yes | 8 |
| utf8_danish_ci | utf8 | 203 | | Yes | 8 |
| utf8_lithuanian_ci | utf8 | 204 | | Yes | 8 |
| utf8_slovak_ci | utf8 | 205 | | Yes | 8 |
| utf8_spanish2_ci | utf8 | 206 | | Yes | 8 |
| utf8_roman_ci | utf8 | 207 | | Yes | 8 |
| utf8_persian_ci | utf8 | 208 | | Yes | 8 |
| utf8_esperanto_ci | utf8 | 209 | | Yes | 8 |
| utf8_hungarian_ci | utf8 | 210 | | Yes | 8 |
| utf8_sinhala_ci | utf8 | 211 | | Yes | 8 |
+--------------------+--------------------+-----+------------+-------------+---------+
22 rows in set (0.03 sec)
Anda juga bisa berlari
mysql> show collation where charset='utf8';
+--------------------+---------+-----+---------+----------+---------+
| Collation | Charset | Id | Default | Compiled | Sortlen |
+--------------------+---------+-----+---------+----------+---------+
| utf8_general_ci | utf8 | 33 | Yes | Yes | 1 |
| utf8_bin | utf8 | 83 | | Yes | 1 |
| utf8_unicode_ci | utf8 | 192 | | Yes | 8 |
| utf8_icelandic_ci | utf8 | 193 | | Yes | 8 |
| utf8_latvian_ci | utf8 | 194 | | Yes | 8 |
| utf8_romanian_ci | utf8 | 195 | | Yes | 8 |
| utf8_slovenian_ci | utf8 | 196 | | Yes | 8 |
| utf8_polish_ci | utf8 | 197 | | Yes | 8 |
| utf8_estonian_ci | utf8 | 198 | | Yes | 8 |
| utf8_spanish_ci | utf8 | 199 | | Yes | 8 |
| utf8_swedish_ci | utf8 | 200 | | Yes | 8 |
| utf8_turkish_ci | utf8 | 201 | | Yes | 8 |
| utf8_czech_ci | utf8 | 202 | | Yes | 8 |
| utf8_danish_ci | utf8 | 203 | | Yes | 8 |
| utf8_lithuanian_ci | utf8 | 204 | | Yes | 8 |
| utf8_slovak_ci | utf8 | 205 | | Yes | 8 |
| utf8_spanish2_ci | utf8 | 206 | | Yes | 8 |
| utf8_roman_ci | utf8 | 207 | | Yes | 8 |
| utf8_persian_ci | utf8 | 208 | | Yes | 8 |
| utf8_esperanto_ci | utf8 | 209 | | Yes | 8 |
| utf8_hungarian_ci | utf8 | 210 | | Yes | 8 |
| utf8_sinhala_ci | utf8 | 211 | | Yes | 8 |
+--------------------+---------+-----+---------+----------+---------+
22 rows in set (0.00 sec)
mysql>
Untuk melihat charset individual dari database, jalankan ini:
mysql> show create database sample;
+----------+-------------------------------------------------------------------+
| Database | Create Database |
+----------+-------------------------------------------------------------------+
| sample | CREATE DATABASE `sample` /*!40100 DEFAULT CHARACTER SET latin1 */ |
+----------+-------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql>
Adapun pengaturannya, Anda bisa mencoba ini:
Tambahkan baris ke my.cnf
[mysqld]
character_set_database=utf8
character_set_server=utf8
kemudian restart mysql
Saya membahas ini kembali pada 01 Agustus 2011: Character Set Encoding in a Table
CAVEAT (Untuk Server MySQL DB di Windows)
Perintah-perintah ini
ALTER DATABASE dbname CHARACTER SET utf8;
ALTER DATABASE dbname COLLATE 'utf8_general_ci';
tidak berfungsi di MySQL Versi Windows karena cara Windows mengunci file. File yang dibutuhkan disebut db.opt
yang terletak di dalam subfolder basis data di datadir
.
Anda mungkin harus melakukan hal berikut:
- mysqldump database itu (tidak ada database membuat info, hanya pembuatan tabel dan INSERT)
- jatuhkan database itu
- buat database dengan charset dan collation spesifik
- memuat kembali dump ke dalamnya
EPILOG
Apa pun yang Anda lakukan, silakan lakukan perubahan apa pun pada Server Dev / Staging untuk mengetahui apakah Anda mendapatkan efek yang diinginkan
UPDATE 2012-12-05 11:00 EDT
Pertanyaan Anda
Haruskah saya benar-benar mengubahnya?
Untuk menjamin perlakuan data yang tepat, Anda mungkin ingin memastikan Anda memiliki apel-ke-apel. Data disiapkan sebagai satu charset dan memuatnya ke dalam tabel dengan database mungkin menyelaraskan data seolah-olah melihat charset lain mungkin tidak akan menampilkan data dengan charset mysqld melihat ketika diambil dan dikirim kembali ke Koneksi DB. Cobalah memuat basis data pada Dev / Staging Server dan bereksperimen dengan pengaturan rangkaian karakter default.
Mengapa beberapa default digunakan utf8
tetapi beberapa default digunakan latin1
?
Ini akan tergantung pada versi OS dari MySQL Binary. Versi Windows mungkin memiliki latin1
sementara Versi Linux dapat digunakan utf8
.
latin1
danutf8
, misalnyacharacter_set_connection
utf8 tetapicharacter_set_database
latin1[mysqld] character_set_database=utf8 character_set_server=utf8
tidak bekerja.latin1
dan harus mengubahnya untuk penyimpanan?