Mengapa karakter_set_server default adalah latin1?

12

Saya menggunakan MySQL 5.5 dan ketika saya menunjukkan variabel tentang charset, saya punya

+--------------------------+----------------------------+
| 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/ |
+--------------------------+----------------------------+

Haruskah saya perlu mengubah character_set_databasedan character_set_serverke utf8?

Yoga
sumber

Jawaban:

8

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.

RolandoMySQLDBA
sumber
Hai, terima kasih atas balasan terperinci Anda. Sebenarnya pertanyaan saya bukan tentang bagaimana mengubahnya, tapi ... 1. Haruskah saya benar-benar mengubahnya? 2. Mengapa beberapa default menggunakan utf8 tetapi beberapa default menggunakan latin1
Yoga
1
(terima kasih lagi dulu) Ini akan tergantung pada versi OS dari Binary MySQL. <- Maksud saya ketika saya berada di Ubuntu, mengapa defaultnya dicampur antara latin1dan utf8, misalnya character_set_connectionutf8 tetapi character_set_databaselatin1
Yoga
1
@Rando [mysqld] character_set_database=utf8 character_set_server=utf8tidak bekerja.
Jorge B.
Saya masih belum mengerti ... bahkan jika host OS menggunakan charset terbatas konyol, seharusnya database tidak secara default menyimpan teks dalam charset yang dapat mewakili karakter apa pun, bahkan jika ia menerima input latin1dan harus mengubahnya untuk penyimpanan?
Andy