Чому за замовчуванням символ_set_server є latin1?


12

Я використовую MySQL 5.5, і коли я показую змінні про charset, у мене є

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

Чи потрібно мені змінити character_set_databaseі character_set_serverна utf8?

Відповіді:


8

Подумай над цим:

  • Ви зберігаєте дані в базі даних як latin1
  • Ви, дані, обробляються внутрішньо mysqld як latin1

Якщо дані, що надходять з ОС або з підключення utf8, як це mysqld обробляти?

Замість того, щоб здогадуватися чи сподіватися на краще, ви можете змінити поведінку набору символів, що надходить. За винятком information_schemaта mysql, візьміть усі ваші бази даних і встановіть для символів за замовчуванням utf8:

ALTER DATABASE dbname CHARACTER SET utf8;

Якщо у вас є конкретна змова, з цим вирішите:

ALTER DATABASE dbname COLLATE 'utf8_general_ci';

Ось такі варіанти на вибір:

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)

Ви також можете бігати

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>

Щоб побачити індивідуальну схему бази даних, виконайте наступне:

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>

Щодо налаштувань, ви можете спробувати це:

Додайте рядки до my.cnf

[mysqld]
character_set_database=utf8
character_set_server=utf8

потім перезапустіть mysql

Я обговорював це ще 01 серпня 2011 року: Кодування набору символів у таблиці

CAVEAT (для серверів DB MySQL у Windows)

Ці команди

ALTER DATABASE dbname CHARACTER SET utf8;
ALTER DATABASE dbname COLLATE 'utf8_general_ci';

не працюють у версії Windows MySQL через те, як Windows блокує файли. Викликається потрібний файл, db.optякий знаходиться в підпапці бази даних в datadir.

Можливо, вам доведеться зробити наступне:

  • mysqldump цю базу даних (жодна база даних не створює інформацію, просто створення таблиці та ВСТАВКИ)
  • скинути цю базу даних
  • створити базу даних за допомогою конкретного діаграми та порівняння
  • перезавантажити на звалище в нього

ЕПІЛОГ

Незалежно від того, що ви робите, будь ласка, виконайте будь-які зміни на Dev / Staging Server, щоб побачити, чи отримаєте ви бажані ефекти

ОНОВЛЕННЯ 2012-12-05 11:00 EDT

Ваші запитання

Чи варто насправді це змінити?

Щоб гарантувати правильну обробку даних, ви можете переконатися, що у вас є яблука-яблука. Дані, підготовлені як один діапазон, і завантажують їх у таблицю з базою даних, можливо, вирівнюючи дані, так, як якщо б вона бачила іншу, вона, ймовірно, не відображатиме дані з тією схемою, яку mysqld бачить при отриманні та відправленні назад до з'єднання з БД. Спробуйте завантажити базу даних на сервер Dev / Staging Server і експериментуйте з налаштуванням графіків за замовчуванням.

Чому деякі параметри за замовчуванням використовуються, utf8але деякі використовують за замовчуванням latin1?

Це залежало б від версії ОС MySQL Binary. Версії Windows можуть мати, latin1хоча Linux Версії можуть використовувати utf8.


Привіт, дякую за детальну відповідь. Насправді мої запитання полягають не в тому, як її змінити, а ... 1. Чи слід насправді змінити? 2. Чому деякі параметри за замовчуванням використовують utf8, а деякі за замовчуванням використовують latin1
Йога

1
(ще раз дякую) Це залежатиме від версії ОС MySQL Binary. <- я маю в виду , коли я на Ubuntu, тому за замовчуванням змішується між latin1і utf8, наприклад , character_set_connectionє utf8 , але character_set_databaseце latin1
Йога

1
@Rolando [mysqld] character_set_database=utf8 character_set_server=utf8не працює.
Хорхе Б.

Я все ще не розумію його, навіть якщо хост ОС використовує якусь нерозумно обмежену гарнітуру, чи не повинна база даних за замовчуванням зберігати текст у комірці, яка може представляти будь-який символ, навіть якщо він приймає вхід latin1і повинен перетворити його для зберігання?
Енді
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.