Думаю об этом:
- Вы храните данные в базе данных как
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
.
latin1
иutf8
, напримерcharacter_set_connection
, utf8, ноcharacter_set_database
является latin1[mysqld] character_set_database=utf8 character_set_server=utf8
не работает.latin1
и должна преобразовать их для хранения?