Опыт есть
              истинный
                               учитель

Янв 10, 2012 - Общее    1 Comment

Кодировка

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

На самом деле я ничего нового не напишу. Единственное что я сделаю — это соберу все воедино. Постараюсь изложить подробно и с картинками.

Начнем? Довольно часто возникает конфликт между файловой системой и базой данных по поводу кодировки. Поэтому обратимся к БД с запросом вида:

SELECT CONCAT(‘ALTER TABLE `’, t.`TABLE_SCHEMA`, ‘`.`’, t.`TABLE_NAME`, ‘` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;’) as sqlcode
FROM `information_schema`.`TABLES` t
WHERE 1
AND t.`TABLE_SCHEMA` = ‘db_name’
ORDER BY 1

database_name — заменяем на вашу базу. Данный запрос работает если mysql 5 или старше и выполнит перекодировку для всех таблиц. После запроса видим сообщение (я его полностью раскрыл, в БД он будет скрыт наполовину):

Как видите запрос присвоил значения, которые должны после окончания стать активными. Чтобы изменение вступило в силу, для этого весь этот запрос добавляем SQL и жмем «go». После успешного выполнения все ваши таблицы будут с измененной кодировкой.

Если метод, который выше не помог, то альтернатива, а точнее обычный запрос. Он отличается тем, что данный запрос заменяет только выбранную таблицу:

ALTER TABLE mytable CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

Идем дальше. Для полного счастья сменим кодировку самой БД:

ALTER DATABASE `db_name` DEFAULT CHARACTER SET cp1251 COLLATE cp1251_general_ci

Это позволит в дальнейшем не возвращаться к кодировкам, так как база будет по умолчанию выставлять для новых таблиц кодировку, которую выбрали вы при смене.

Если же танцы с БД ни к чему не привели, то обращаемся к автоматизации (скриптам). Я могу предложить этот: Скачать

данный скрипт позволит сменить кодировку файлов и в самой базе. Работает он на bitrix ( то бишь при загрузке данного скрипта происходит проверка обязательных значений). Основным из таких является mbstring.func_overload 2. Это значение нужно присвоить в php.ini. В php 5.2.8 параметр меняется глобально на весь сервер (для этого нужно посмотреть на результат после выполнения :

Expected result:
—————-
mbstring.func_overload
Local Value = 7
Master Value = 0

Actual result:
—————
mbstring.func_overload
Local Value = 0
Master Value = 0

На выделенном сервере смена происходит на ура. Чтобы решить эту проблему в случае, если вы арендуете, обратитесь к хостеру.
Я могу предложить одно. Это скачать дистриб bitrix, сделать дамп вашей базы перезалить на локалку ваш сайт и сменить кодировку. Ниже показана работа скрипта:


Если же вы решили сделать все это на хостинге, то настоятельно рекомендую сделать резерв базы. Так как если что-то пойдет не так, все данные будут потеряны.
Дальше все идет как по маслу:

Этапы перехода

Подготовить сервер как показано выше
Добавить в /bitrix/php_interface/dbconn.php
define(«BX_UTF», true);

Изменить в настройках сайта кодировку с windows-1251 на utf-8
Изменить в настройках языка ru кодировку с windows-1251 на utf-8
Конвертировать все файлы в utf8
Конвертировать БД в utf8
Сменить в /bitrix/php_interface/after_connect.php
$DB->Query(«SET NAMES ‘cp1251′»);
на
$DB->Query(«SET NAMES ‘utf8′»);

Сбросить весь кеш
Выйти и зайти на сайт чтобы обновить данные сессии.

Есть вариант со сменой кодировок еще один. Это iconv, но иногда этот метод подводит. Он зачастую криво приписывает данные.
Но все равно, разберем его.
Основа такова — делаем дамп базы — > заливаем в новой кодировке.

Делаем дамп. Тут обязательность имени пользователя и пароля зависит от настроек
mysqldump —opt -u имя_пользователя -pпароль название_базы > dump.sql

Теперь ковертируем наш дамп в юникод
iconv -f cp1251 -t utf8 dump.sql > dump-utf8.sql

Создаем временную базу, чтобы проверить — всё ли впорядке
CREATE DATABASE название_базы_utf CHARACTER SET utf8 COLLATE utf8_general_ci;

Импортируем наш дамп во временную базу
mysql -u имя_пользователя -pпароль —default-character-set=utf8 название_базы_utf < dump-utf8.sql

удаляем обе базы:
DROP DATABASE название_базы; DROP DATABASE название_базы_utf;

Создаем новую нашу базу
CREATE DATABASE название_базы CHARACTER SET utf8 COLLATE utf8_general_ci;

Импортируем чистовик
mysql -u имя_пользователя -pпароль —default-character-set=utf8 название_базы < dump-utf8.sql

Уточнения: команды жирным шрифтом выполням в bash, а курсивом — в mysql консоли.

Но думаю до скриптов и iconv Вам не придется доходить, а будет достаточно попробовать выше перечисленные запросы. Удачной работы 🙂

1 Comment

  • […] Исправление кодировки на сайте возникает у новичков, в интернете очень много мусора по этому запросу. Вот здесь я нашел нормальную информацию, которая реально мне помогла. Фев2 […]

Got anything to say? Go ahead and leave a comment!