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_schemai 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.optktó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, utf8a niektóre domyślne latin1?
Zależy to od wersji MySQL Binary. Wersje systemu Windows mogą mieć, latin1podczas gdy wersje systemu Linux mogą korzystać utf8.