Почему по умолчанию character_set_server является latin1?
Я использую 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
?
1 ответ
Подумайте об этом:
- Вы сохраняете данные в базе данных как
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 DB Servers в Windows)
Эти команды
ALTER DATABASE dbname CHARACTER SET utf8;
ALTER DATABASE dbname COLLATE 'utf8_general_ci';
не работают в версии Windows MySQL из-за того, как Windows блокирует файлы. Необходимый файл называется db.opt
, который находится в подпапке базы данных в datadir
.
Возможно, вам придется сделать следующее:
- mysqldump в этой базе данных (без создания базы данных, просто создания таблицы и INSERT)
- удалить эту базу данных
- создать базу данных с определенной кодировкой и сортировкой
- перезагрузка в дампе в нее
Эпилог
Независимо от того, что вы делаете, выполните любые изменения на Dev /Staging Server, чтобы узнать, получаете ли вы нужные эффекты.
ОБНОВЛЕНИЕ 2012-12-05 11:00 EDT
Ваши вопросы
Должен ли я действительно изменить его?
Чтобы гарантировать правильное обращение с данными, вы можете захотеть убедиться, что у вас есть яблоки для яблок. Данные, подготовленные в виде одной кодировки и загрузки ее в таблицу с базой данных, возможно, выравнивающей данные, как если бы она увидела другую кодировку, вероятно, не отображали данные с помощью набора символов mysqld при получении и отправке обратно в соединение БД. Попробуйте загрузить базу данных на Dev /Staging Server и поэкспериментируйте с настройками кодировок по умолчанию.
Почему некоторые значения по умолчанию используют
utf8
, но по умолчанию используетсяlatin1
?
Это будет зависеть от версии операционной системы MySQL Binary. В версиях Windows может быть latin1
, в то время как версии Linux могут использовать utf8