Почему default_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

Я обсуждал это еще 1 августа 2011 года: кодировка набора символов в таблице

CAVEAT (для серверов БД MySQL в Windows)

Эти команды

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

не работают в версии MySQL для Windows из-за способа, которым Windows блокирует файлы. Необходимый файл называется, db.optкоторый находится в подпапке базы данных в datadir.

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

  • mysqldump эту базу данных (нет информации для создания базы данных, только создание таблицы и вставки)
  • удалить эту базу данных
  • создать базу данных с определенной кодировкой и сопоставлением
  • перезагрузить в свалку в него

Эпилог

Независимо от того, что вы делаете, пожалуйста, внесите любые изменения на Dev / Staging Server, чтобы увидеть, если вы получите желаемый эффект

ОБНОВЛЕНИЕ 2012-12-05 11:00 ПО ВОСТОЧНОМУ ВРЕМЕНИ

Ваши вопросы

Должен ли я действительно изменить это?

Чтобы гарантировать правильную обработку данных, вы можете убедиться, что у вас есть яблоки к яблокам. Данные, подготовленные как одна кодировка и загружающие ее в таблицу с базой данных, возможно, выровняют данные так, как будто она видит другую кодировку, вероятно, не будет отображать данные с набором символов, которые mysqld видит, когда извлекается и отправляется обратно в соединение с БД. Попробуйте загрузить базу данных на Dev / Staging Server и поэкспериментируйте с настройкой кодировок по умолчанию.

Почему некоторые значения по умолчанию используют, utf8а некоторые используют по умолчанию latin1?

Это будет зависеть от версии ОС MySQL Binary. Версии Windows могут иметься, в latin1то время как Версии Linux могут использовать utf8.

RolandoMySQLDBA
источник
Привет, спасибо за ваш подробный ответ. На самом деле мои вопросы не о том, как это изменить, а ... 1. Должен ли я действительно изменить это? 2. Почему некоторые значения по умолчанию используют utf8, а некоторые по умолчанию используют latin1
Yoga
1
(еще раз спасибо) Это будет зависеть от версии ОС MySQL Binary. <- Я имею в виду, когда я нахожусь на Ubuntu, почему по умолчанию смешано между latin1и utf8, например character_set_connection, utf8, но character_set_databaseявляется latin1
Yoga
1
@ Роландо [mysqld] character_set_database=utf8 character_set_server=utf8не работает.
Хорхе Б.
Я до сих пор не понимаю ... даже если хост-операционная система использует какую-то глупую ограниченную кодировку, не должна ли база данных по умолчанию хранить текст в кодировке, которая может представлять любой символ, даже если она принимает входные данные latin1и должна преобразовать их для хранения?
Энди