Лечим кодировки MySQL

Мне наплевать, жив я иль мертв, Куда-то иду или пьян с утра. Твой папа
сказал, что я порнократ, А я видел в жизни так много дерьма.

Последнее время случается много всякого плохого. Но все плохое, если относится к нему с должным уважением, отзывается хорошим. Например, после падения сервера мне опять есть чем поделиться.
Этим начнем серию постов про то как сделать свою жизнь проще.
Начать хочется с известной проблемы: создали базу, работали-работали и вдруг обнаружилось что поиск ищет не так, сортировки идут не туда. Как правило выясняется что проблема в кодировке.
Итак, мой рецепт как это лечить.

Прежде всего настроим терминал в той кодировке, в которой планируем сохранять базу. В моем случае это UTF-8. Теперь надо проверить в какой кодировке у нас мускульный клиент:

mysql> SHOW VARIABLES LIKE 'collation_connection'\G
*************************** 1. row ***************************
Variable_name: collation_connection
Value: latin1_swedish_ci

Ага! Смотрим теперь на нашу базу:

mysql> SELECT name FROM category ORDER BY id DESC LIMIT 1\G
*************************** 1. row ***************************
name: Посудомоечная машина
1 row in set (0.00 sec)

Итого: Сайт у нас создан и заполнен на шведской латинице. Все видится, но по понятным причинам поиск не происходит. Посмотрим на наши таблицы:

mysql> SHOW CREATE TABLE category\G
*************************** 1. row ***************************
Table: category
Create Table: CREATE TABLE `category` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`),
) ENGINE=MyISAM AUTO_INCREMENT=88 DEFAULT CHARSET=utf8

Ага! База в UTF, но т.к. коннект в шведском внутри лежит бред.

Теперь нам надо сделать дамп нашей базы, при этом исключив всю информацию о чарсете:
Теперь запускаем консольный мускуль и пытаемся выбрать из дампа, причем указываем кодировку ту же что и был у коннкешена:

$ mysqldump --skip-set-charset --default-character-set=latin1 db category > dump.sql

Открываем дамп и смотрим на него. Должны получить привычные русские символы. Бинго, у нас рабочий дамп.

Дальше можно вписать в первую строку «SET NAMES UTF8;» и влить базу обратно.
А можно пойти по пути перфекциониста и поправить, наконец, сам клиент.

$ vim ~/.my.cnf
[client]
default-character-set=utf8

Теперь при запуске мускуля мы будем писать в правильной кодировке.
Заливаем дамп

$ cat dump.sql | mysql db

Проверяем, радуемся!

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

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

*


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