Чиним кодировки в mysql

Вопрос неожиданный, зато ежедневный.
Есть сайт, на сайте все работает, русский язык отображается, однако поиск работает как-то не так – игнорирует регистр.

Начинаем разбираться:

Выполняем в консоли команду:

mysql> show variables like '%char%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |

Вот и оно – клиент у нас работает в latin1, а сервер хранит в базе utf8. Всех все устраивает русский отображается, только сервер нормальный поиск по базе ни в жизнь не сделает, т.к. в этих закорючках не разбирается и где там какой регистр не понимает.

Решение

Установить сразу после коннекта правильную кодировку:
0. mysql_query(«SET NAMES utf-8′);

Решение супер, одна беда – база уже есть, база наполнена и она в непонятной кодировке.
1. Придется сначала получить старую базу в читаемом формате:
mysqldump –default-character-set=latin1 –opt –skip-set-charset database > dump.sql
latin1 – кодировка из параметра character_set_connection.
Получаем файл database.sql, убеждаемся что он читабелен и в уникоде (например смотрим через браузер, проверяем что русские буквы таки русские).
2. Создаем новую базу, правильно указываем кодировку при создании:
CREATE DATABASE `database_utf` CHARACTER SET utf8 COLLATE utf8_general_ci;
3. Заливаем полученный дамп базы обратно, при этом не забываем указать новую кодировку соединения:
mysql –default-character-set=utf8 database < dump.sql
4. Открываем сайт, ужасаемся знакам вопроса, успоминаем про пункт 0, про который мы помнили в начале и забыли теперь. Дописываем эту строку в PHP код и обновляем сайт. Танцы!

Правим конфиг mysql

Если вам повезло и есть доступ рута к серверу можно решить эту проблему раз и навсегда – прописать для сервера и клиента дефолтовые кодировки.
Для этого в /etc/my.cnf находим вкладки [client] И [server] и дописываем одну и ту же строку:
default-character-set=utf8
сохраняем файл, рестартуем mysql
После этого первый запрос будет иметь правильный вид:

mysql> show variables like '%char%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| 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/ |

Вот теперь точно танцы!

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*


Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>