MySQL

Кодировка в MySQL по умолчанию

alex » 24 сен 2013, 21:13

У СУБД MySQL есть такая особенность, что по умолчанию кодировка создаваемой базы данных устанавливается как latin1 (ISO 8859-1) — кодовая страница, предназначенная для западноевропейских языков, — это однобайтная кодировка, в которой отсутствуют символы кириллицы. А, например, сравнение (collation) в базе по умолчанию производится по правилам "latin1_swedish_ci". Это всё пошло от того что MySQL начала разрабатывать шведская компания "MySQL AB", которая несколько раз поглощалась и теперь принадлежит Oracle.
Конечно, возможны разные варианты установки сервера и клиента MySQL, и где-то по умолчанию будет зашита иная кодировка типа utf-8 либо будет браться из локали операционной системы хоста.
Например, если установить на Windows машине пакет Денвер, то там Д. Котеров уже "заботливо" прописал кодировку cp1251 в конфиге "my.cnf", поэтому пришлось менять её на utf8:
Код: Выделить всё
# Следующие параметры будут переданы всем клиентским программам
# (например, mysql.exe). ВНИМАНИЕ: если не сработает, укажите
# путь к my.cnf ЯВНО, например:
#
# mysql.exe --defaults-file=/usr/local/mysql5/my.cnf ...
#
[client]
port = 3306
socket = /tmp/mysql5.sock
default-character-set = utf8 # было cp1251
character-sets-dir = /usr/local/mysql5/share/charsets
#
# Параметры MySQL-сервера.
#
[mysqld]
# Использовать режим совместимости с клиентами MySQL 3.x и MySQL 4.0.
old-passwords
# Кодировка баз данных по умолчанию.
default-character-set = utf8 # было cp1251
init-connect = "set names utf8" # было cp1251
skip-character-set-client-handshake


А вот я, например, поставил на Ubuntu пакет LAMP, используя утилиту Tasksel.
И вот что имею по умолчанию:
Кодировка в MySQL по умолчанию
MySQL клиент, вывод кодировок по умолчанию.
mysql_default_charsets.gif (27.59 Кб) Просмотров: 11451


Вообще, у MySQL имеется куча параметров, задающих кодировки сервера/базы/таблиц/столбцов/клиента и соответственно, Collation.
http://dev.mysql.com/doc/refman/5.5/en/charset.html

На сайте http://help.ubuntu.ru/wiki/mysql рекомендуют в /etc/mysql/my.cnf прописать следующие директивы (для случая с utf8):
Код: Выделить всё
В секцию [mysqld] добавьте следующие строки:

skip-character-set-client-handshake
default-character-set=utf8
init-connect='SET NAMES utf8'
default-collation=utf8_general_ci

Так же желательно установить кодировку для клиента и mysqldump. Для этого в секциях [client] и [mysqldump] необходимо добавить строчку:

default-character-set=utf8

Но "default-character-set=name" для сервера, начиная с версии 5.0.0 эта директива считается устаревшей и не рекомендуется к использованию.
Вместо неё нужно указывать "character-set-server" и "collation-server". Таким образом, получается что если мы хотим работать с кодировкой utf8, то кошерный /etc/mysql/my.cnf должен иметь следующие директивы:
Код: Выделить всё
[mysqld]
character-set-server = utf8
collation-server = utf8_general_ci

[client]
default-character-set = utf8

(Группа [mysqld] — это для сервера, группа [client] — для клиентов). Естественно, после этого нужно перезапустить сервер, и иметь в виду что все эти настройки будут применяться только для вновь создаваемых баз и их таблиц. Т. к. базы, созданные до этого имеют старую кодировку по умолчанию, и соответственно, по умолчанию новые таблицы будут создаваться в них тоже со старыми кодировками (Latin1).
Это нужно лечить уже другими методами типа "ALTER DATABASE", "ALTER TABLE" и т. п., обязательно сделав дамп базы перед этим.
Итак, перезапускаем сервер и видим:
Кодировка в MySQL по умолчанию
MySQL кодировка по умолчанию сменена на utf8.
mysql_default_charsets_new.gif (25.78 Кб) Просмотров: 11451


P. S. Т. к. в интернете достаточно много рецептов по поводу смены кодировок в MySQL, там и "skip-character-set-client-handshake" директиву и "init-connect='SET NAMES utf8'" предлагают писать, то хотелось бы услышать комментарий грамотного человека, т. к. я все-таки не спец. в MySQL. Просто постарался внимательнее почитать документацию на сайте разработчика для версии MySQL 5.5 http://dev.mysql.com/doc/refman/5.5/en/.
alex
Администратор
 
Сообщения: 66
Зарегистрирован: 17 апр 2010, 00:45

Вернуться в SQL