man linux — заметки админа

24 февраля 2016

Кодировки MySQL

MySQL имеет множество настроек связанных с кодировками, что может приводить к проблемам, например, при переносе БД с сервера на сервер, когда кодировки MySQL исходного и целевого серверов отличаются. Но в большинстве случаев, эти проблемы достаточно легко решаются.

Один из примеров решения таких проблем показан в этой статье. Но иногда, даже таких мер оказывается недостаточно.
Смысл в том, чтобы соответствовала кодировка хранения данных, кодировка сопоставления (сравнения collation) при выборке данных скриптом и непосредственно кодировка работы сайта.

Если дамп базы сохранен в нужной кодировке (проверить это можно, открыв его в соответствующей кодировке при помощи текстового редактора и убедившись, что кириллические символы отображаются корректно), если в дампе правильно указаны кодировки таблиц, например, если дамп сохранен в кодировке UTF-8, то в дампе, код создания таблицы должен выглядеть примерно так:

CREATE TABLE `abies_blocks` (
здесь код
) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

Обратите внимание на строку:

DEFAULT CHARSET=utf8;

Если же дамп в кодировке cp1251 и БД должна работать в этой кодировке, то строка может выглядеть так:

DEFAULT CHARSET=cp1251 COLLATE cp1251_general_ci;

Обратите внимание на добавленную опцию COLLATE, указывающую сравнение — эта опция может потребоваться для корректной работы на некоторых серверах.
Также, нужно убедиться, что БД имеет правильную кодировку. Например, панель управления Ispmanager, позволяет указать кодировку БД при создании базы.
Импортировав такой дамп в базу, можно проверять работу сайта. Если сайт всё еще не работает корректно, можно, как в статье добавить в код скрипта, сразу после соединения с БД (mysql_connect) код, указывающий в какой кодировке нужно работать:

mysql_query('SET NAMES utf8');

Но иногда, даже этого оказывается недостаточно. Тогда, можно попробовать добавить следом вот такой код:

mysql_set_charset('cp1251');

Также, существуют его вариации, например:

mysqli_set_charset($db, 'cp1251');

В общем и в целом, стандартом стало использование кодировки UTF-8 и можно смело рекомендовать переводить все сайты на эту кодировку, чтобы не иметь проблем с переносом БД.

 


Автор: Виктор Симон
www.man-linux.ru
Права копирования

Опубликовано 24 февраля 2016 - информация могла устареть.

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

No comments yet.

RSS feed for comments on this post.

Leave a comment

Для отправки комментария вам необходимо авторизоваться.

Powered by WordPress