Pomyśl o tym:
- Przechowujesz dane w bazie danych jako
latin1
- Jesteś dane są przetwarzane wewnętrznie przez mysqld as
latin1
Jeśli dane pochodzące z systemu operacyjnego lub połączenia są utf8
, to w jaki sposób mysqld je potraktuje?
Zamiast zgadywać lub mieć nadzieję na najlepsze, możesz zmienić zachowanie przychodzącego zestawu znaków. Z wyjątkiem information_schema
i mysql
, weź wszystkie bazy danych i ustaw domyślny zestaw znaków na utf8
:
ALTER DATABASE dbname CHARACTER SET utf8;
Jeśli masz do czynienia z konkretnym zestawieniem, wykonaj następujące czynności:
ALTER DATABASE dbname COLLATE 'utf8_general_ci';
Oto zestawienia do wyboru:
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)
Mógłbyś także biec
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>
Aby zobaczyć indywidualny zestaw znaków bazy danych, uruchom to:
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>
Jeśli chodzi o ustawienia, możesz spróbować:
Dodaj linie do my.cnf
[mysqld]
character_set_database=utf8
character_set_server=utf8
następnie uruchom ponownie mysql
Omówiłem to z powrotem 01 sierpnia 2011: Kodowanie zestawu znaków w tabeli
CAVEAT (dla serwerów MySQL DB w systemie Windows)
Te polecenia
ALTER DATABASE dbname CHARACTER SET utf8;
ALTER DATABASE dbname COLLATE 'utf8_general_ci';
nie działają w wersji MySQL w systemie Windows ze względu na sposób blokowania plików przez system Windows. Wywoływany jest potrzebny plik, db.opt
który znajduje się w podfolderze bazy danych w datadir
.
Może być konieczne wykonanie następujących czynności:
- mysqldump tę bazę danych (brak informacji o tworzeniu bazy danych, po prostu tworzenie tabeli i INSERT)
- upuść tę bazę danych
- utwórz bazę danych z określonym zestawem znaków i zestawieniem
- załaduj do niego zrzut
EPILOG
Bez względu na to, co robisz, wprowadź zmiany na serwerze deweloperskim / pomostowym, aby sprawdzić, czy uzyskasz pożądane efekty
AKTUALIZACJA 2012-12-05 11:00 EDT
Twoje pytania
Czy powinienem to naprawdę zmienić?
Aby zagwarantować prawidłowe przetwarzanie danych, możesz mieć pewność, że masz jabłka od jabłek. Dane przygotowane jako jeden zestaw znaków i załadowanie go do tabeli z bazą danych, która może wyrównać dane, tak jakby widział inny zestaw znaków, prawdopodobnie nie wyświetlałby danych z zestawem znaków, który mysqld widzi po pobraniu i wysłaniu z powrotem do połączenia z bazą danych. Spróbuj załadować bazę danych na serwer deweloperski / pomostowy i eksperymentuj z ustawianiem domyślnych zestawów znaków.
Dlaczego niektóre domyślne zastosowania, utf8
a niektóre domyślne latin1
?
Zależy to od wersji MySQL Binary. Wersje systemu Windows mogą mieć, latin1
podczas gdy wersje systemu Linux mogą korzystać utf8
.
latin1
iutf8
, na przykładcharacter_set_connection
jest utf8 alecharacter_set_database
jest latin1[mysqld] character_set_database=utf8 character_set_server=utf8
nie działa.latin1
i musi je przekonwertować do przechowywania?