Dlaczego domyślnym serwerem_znaków jest latin1?

12

Używam MySQL 5.5 i kiedy pokazuję zmienne o charset, mam

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

Należy muszę zmienić character_set_databasei character_set_serverdo utf8?

Joga
źródło

Odpowiedzi:

8

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.

RolandoMySQLDBA
źródło
Cześć, dziękuję za szczegółową odpowiedź. Właściwie moje pytania nie dotyczą tego, jak to zmienić, ale ... 1. Czy naprawdę powinienem to zmienić? 2. Dlaczego niektóre domyślne używają utf8, a inne domyślne latin1
Yoga
1
(jeszcze raz dziękuję) Zależy to od wersji binarnej MySQL. <- To znaczy, kiedy jestem na Ubuntu, dlaczego domyślny jest mieszana między latin1i utf8, na przykład character_set_connectionjest utf8 ale character_set_databasejest latin1
Yoga
1
@Rolando [mysqld] character_set_database=utf8 character_set_server=utf8nie działa.
Jorge B.,
Nadal nie rozumiem ... nawet jeśli system operacyjny hosta używa jakiegoś głupiego zestawu znaków, baza danych nie powinna domyślnie przechowywać tekstu w zestawie znaków, który może reprezentować dowolny znak, nawet jeśli akceptuje dane wejściowe latin1i musi je przekonwertować do przechowywania?
Andy