четверг, 30 августа 2007 г.

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.

8 комментариев:

Анонимный комментирует...

Тока на cp1251 свет клином не сошелся....
и это неправильная кодировка....
самая правильная utf-8

klek комментирует...

Согласен, но по необходимости, мне приходится работать с cp1251.

Анонимный комментирует...

Премного благодарен, второй день искал решение этой проблемы, Ваш совет помог...

Связка Ubuntu + Apache + ColdFusion + MySQL.
Из бэкапа через phpMyAdmin встало все нормально. Развернутый ColdFusion никаких настроек кодировки не предложил, мои *.cfm-скрипты были написаны в utf-8, соответственно базу тоже сконвертил в utf-8 через MySQL Query Browser. Но первый же тест показал, шо це бэз бубна не пашет.
Причем (!) при втыкании INSERT-а ручками из MySQL Query Browser кириллица отлично кушалась.
Перекопал все конфиги, в первую очередь CF, добрался даже до Апачевских - везде utf-8. А оно вон оно как!

Анонимный комментирует...

Между прочим, если вам когда-нибудь потребуется заблокировать какой-либо сотовый телефон или другое средство связи, то воспользуйтесь для этого Блокираторы мобильных.

andrew комментирует...

Очень дельная статья.
Большое спасибо мне очень помогло при настройки грабера были проблеммы.

Ihty комментирует...

Отлично. Большое спасибо. Кратко лаконично. И главное все работает.

Ihty комментирует...

Отлично. Большое спасибо. Кратко лаконично. И главное все работает.

CYBERGROM комментирует...

СПАСИБИЩЕ!!!
Очень помогло, долго бился с БД не мог понять в чем дело. =)