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_schemadan 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.optyang 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 utf8tetapi beberapa default digunakan latin1?
Ini akan tergantung pada versi OS dari MySQL Binary. Versi Windows mungkin memiliki latin1sementara Versi Linux dapat digunakan utf8.