Реклама

вторник, 7 января 2014 г.

Поддержка кириллицы в MySQL 5.5 под Ubuntu

Итак, имеем MySQL 5.5, Ubuntu 12.04 и web-приложение, работающее под apache tomcat 7. Если мы попытаемся прочитать параметр из базы, значение которого содержит кириллицу, то в ответ получим нечто вроде "????????". Давайте разберемся в чем проблема.


Наша задача - заставить MySQL сервер работать с кодировкой UTF-8. По-умолчанию в Ubuntu MySQL устанавливается с кодировкой latin1. В этом можно убедиться посмотрев вывод запроса:

SHOW VARIABLES LIKE 'char%';

В ответ получим что-то вроде:

character_set_client       latin1                      
character_set_connection   latin1                    
character_set_database     latin1                    
character_set_filesystem   binary                   
character_set_results      latin1                    
character_set_server       latin1                   
character_set_system       utf8                       
character_sets_dir         /usr/share/mysql/charsets/
 
В связи с этим, даже используя при работе с сервером команду:

SET names utf8;

и используя при создании таблиц:

...DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

невозможно добиться полной поддержки кодировки utf8:
character_set_client       utf8                      
character_set_connection   utf8                    
character_set_database     latin1                    
character_set_filesystem   binary                   
character_set_results      latin1                    
character_set_server       latin1                   
character_set_system       utf8                       
character_sets_dir         /usr/share/mysql/charsets/

Кодировка по-умолчанию все равно останется latin1, что неудобно и может привести к ошибкам. 

Чтобы сервер сразу загружался с нужной кодировкой, необходимо отредактировать файл /etc/mysql/my.cnf:

sudo nano -w /etc/mysql/my.cnf       

В секцию [mysqld] добавьте следующую строку:


character-set-server=utf8

Нужно обратить внимание, что параметр
default-character-set в секции [mysqld] устарел и не используется!!! 
Также желательно установить кодировку для клиента и mysqldump. Для этого в секциях [client] и [mysqldump] необходимо добавить строчку:

default-character-set=utf8

Теперь необходимо перегрузить сервер MySQL:

sudo service mysql restart      

Если теперь выполнить команду SHOW VARIABLES LIKE 'char%' на MySQL сервере, то получим желаемый результат:

character_set_client       utf8                      
character_set_connection   utf8                    
character_set_database     utf8                    
character_set_filesystem   binary                   
character_set_results      utf8                    
character_set_server       utf8                   
character_set_system       utf8                       
character_sets_dir         /usr/share/mysql/charsets/

При настройке подключения к серверу необходимо указать параметры подключения useUnicode=true и charSet=UTF8. Например:

jdbc.url=jdbc:mysql://localhost:3306/MYBASE?autoReconnect=true&useUnicode=true&charSet=UTF8
 

Комментариев нет:

Отправить комментарий