Проблема с кодировкой при вставке записей в БД

Рейтинг: 4Ответов: 1Опубликовано: 26.02.2015

Здравствуйте уважаемые форумчане. При попытке вставить запись с русскими символами, бьется кодировка. Вот сведения о таблице

 (`id` int(11) NOT NULL AUTO_INCREMENT,
 `xml_id` varchar(150) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL,
 `name` varchar(150) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL,
 `inn` varchar(20) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL,
 `kpp` varchar(20) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL,
 `register_addr` varchar(150) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL,
 `actual_addr` varchar(150) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL,
 `work_phone` varchar(20) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL,
 `email` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`id`)
  ) ENGINE=MyISAM AUTO_INCREMENT=220 DEFAULT CHARSET=utf8

Вот код, с помощью которого выполняется запись

$dbLink = mysql_connect($DBHost, $DBLogin, $DBPassword);//Знаю, что рекомендуют использовать PDO, но этой возможности сейчас нет.
mysql_set_charset('utf8',$dbLink);
mysql_select_db($DBName, $dbLink);
mysql_query('INSERT INTO test (name) values (\'юююю\')', $dbLink);

Файл в кодировке UTF-8 без BOM. Пробовал деталь так:

mysql_query("SET NAMES 'utf8'", $dbLink); 
mysql_query("SET CHARACTER SET 'utf8'", $dbLink );

Не помогло.

mysql_client_encoding();//Возвращает utf8

Если выполнить такой запрос

SELECT CHARSET(name) from test;

Получаю значение utf8

Подскажите, пожалуйста, в чем может быть проблема. Заранее спасибо.

Обновление

Факт битой кодировки определяю путем запроса SELECT ... в консоли. С СУБД соединяюсь с помощью putty. В настройках кодировки соединения стоит utf8, но я вижу крякозябы. На самой html странице все нормально смотрится.

Вот, на всякий случай, кусочек конфига my.cnf

[client]
default-character-set=utf8

[mysql]
default-character-set=utf8

[mysqld]
collation-server = utf8_general_ci
init-connect='SET NAMES utf8'
character-set-server = utf8

Еще один момент. По непонятным причинам я не могу установить COLLATE в значение utf8_general_ci Пишу следующий запрос

ALTER TABLE test MODIFY name varchar(150) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL

В итоге получаю следующий результат name varchar(150) и все. Ни CHARACTER SET ни COLLATE

Ответы

▲ 2

как я понял, проблема в том, что при подключении из ms/windows с помощью программы putty по протоколу ssh и выполнении sql-запроса в оболочке mysql, выводимые символы выглядят «как-то неправильно».

«виновных» может быть несколько: сама база данных, сервер базы данны, клиент базы данных, консоль сервера, putty, ms/windows.

чтобы рассечь этот «гордиев узел» примерно пополам (на пункте «консоль сервера»), выполните, подключившись к серверу обычным путём, такую команду:

$ echo -e '\xd1\x8e'

если будет выведена русская буква ю, значит, проблема «слева» от пункта «консоль сервера».

если же увидите «что-то неправильное», то попробуйте так (*):

$ export LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8
$ echo -e '\xd1\x8e'

если увидите букву ю, то проблема локализована: добавьте первую из строк в конец файла ~/.bashrc (я предполагаю, что в качестве оболочки на сервере используется именно gnu/bash).

если же опять увидите «что-то неправильное», то проверьте, сгенерирована ли локаль en_US.UTF-8 (в выводе она может называться и en_US.utf8 — это допустимо):

$ locale -a | grep en_US

если локали такой нет — сгенерируйте её:

$ echo 'en_US.UTF-8' | sudo tee -a /etc/locale.gen
$ sudo locale-gen

после генерации локали имеет смысл перелогиниться.

если упомянутая локаль в системе присутствует, а две команды (после попробуйте так (*)) всё равно возвращают «что-то непонятное», то проблема «справа» от пункта «консоль сервера».


то, что «слева» от пункта «консоль сервера», я разбирать уже не буду, т.к. с огромной вероятностью проблема к этому моменту уже локализована.