Думаю об этом:
- Вы храните данные в базе данных как
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.