Вы здесь

MySQL and cp1251

У меня в базе MySQL все записи хранятся в кодировке cp1251. Сделано это по причине того что все клиенты, работающие с базой, сидят под виндами, да и наши сайты выдают страницы в cp1251.
Все это нормально работало до момента установки Kubuntu 7.04 на мой рабочий комп. При работе с базой с этой машины я получал строки в виде '?????', хотя остальные сервера с установленной SuSE 10.0 выдавали нормальный результат...
Начались "танцы с бубном"... Первым делом я вспомнил, что имел привычку самому собирать rpm-ку MySQL для своих серверов с жестко зашитой опцией --with-charset=cp1251, поэтому и клиенты и сервера работали с этой кодировкой по умолчанию.

При переходе на Kubuntu я решил не мучится и поставить пакет MySQL, входящий в дистрибутив. Вот здесь и была засада... Наверно во всех дистрибутивах Linux MySQL собирается с дефолтной кодировкой Latin1.
Системные переменные MySQL с дефолтной кодировкой:

  • character set client: latin1
  • character set connection: latin1
  • character set database: latin1
  • character set results: latin1
  • character set server: latin1
  • collation connection: latin1_swedish_ci
  • collation database: latin1_swedish_ci
  • collation server: latin1_swedish_ci

Вобщем полная... latin1.
Начал копать в документации на сайте www.mysql.com, много узнал нового, особо помогли комментарии пользователей. После суммирования всех полученных знаний, был выведен рецепт перевода базы с latin1 на cp1251 без пересборки пакета. Нужно править файл настроек /etc/mysql/my.cnf. В секции client и mysqld нужно внести дополнения. Привожу эти секции поностью:

[client]
port = 3306
socket = /var/run/mysqld/mysqld.sock
default-character-set = cp1251
[mysqld]
#
# * Basic Settings
#
user = mysql
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
port = 3306
basedir = /usr
datadir = /var/lib/mysql
tmpdir = /tmp
language = /usr/share/mysql/english
skip-external-locking
default-character-set = cp1251
character_set_server = cp1251
collation_server = cp1251_general_ci
skip-character-set-client-handshake

После рестарта сервера изменились системные переменные:

  • character set client: cp1251
  • character set connection: cp1251
  • character set database: cp1251
  • character set results: cp1251
  • character set server: cp1251
  • collation connection: cp1251_general_ci
  • collation database: cp1251_general_ci
  • collation server: cp1251_general_ci

Теперь клиенты и сервера (k)ubuntu работают с базой правильно, т.е. в кодировке cp1251.

Оригинал статьи: http://klek.blogspot.com/2007/08/mysql-and-cp1251.html.