- Настройка MySQL
- default-character-set=cp1251 – не работает
- Рабочая конфигурация my.cnf MySQL
- Перевод записей БД MySQL из UTF-8 в Windows-1251
- Конвертация базы из Windows1251 в UTF8
- Исправление и изменение кодировок MySQL
- Небольшое отступление. Sypex Viewer
- Данные в cp1251 таблицы в latin1
- Данные и таблицы в utf8, но кодировка соединения latin1
- Изменение кодировки
- Кодировка соединения
Настройка MySQL
Установка всего программного обеспечения как MySQL, так и прочих пакетов (PHP, Phpmyadmin) была произведена на самом начальном этапе, — если помните, делали мы это командой: apt-get install apache2 php5 php5-mysql mysql-server phpmyadmin — см. подробнее->>>.
На какую процедуру пришлось убить больше всего времени при настройке MySQL, так это настройка кодировки. При извлечении информации из базы средствами PHP русские слова отображаются как вопросительные знаки — . Здесь существует проблема с кодировкой, так как загружаемая MySQL из репозитория Linux (Ubuntu 13.04) имеет кодировку UTF8 вперемешку с latin1, таким образом, любая из кодировок (cp1251 или utf8) при извлечении из MySQL будет отображаться коряво.
Если вам необходимо настроить кодировку cp1251, то первый способ, который легко отыскать в интернете и дающий решение данной проблемы – это просто в скрипт PHP, который у вас извлекает контент из базы, добавить вот такую строку:
mysql_query(«SET NAMES cp1251»);
Если не устраивает вариант, предусматривающий правку скритов, то необходимо править конфигурационный файл MySQL, в этой связи, прежде чем был найден ответ, была перепробована масса всяких вариантов, большинство из которых, вероятно, подходили для ранних версий Linux Ubuntu, но они не работают для UBUNTU 13.04.
default-character-set=cp1251 – не работает
Будем править конфигурационный файл my.cnf, который находится в каталоге /etc/mysql/my.cnf. Причем, если просто в my.cnf (путь — /etc/mysql/my.cnf ) [mysqld] заменить на такой вариант:
[mysqld]
default-character-set=cp1251
сохраняемся и перегружаемся:
service mysql restart
тогда при подключении к phpmyadmin мы получаем вот такую ошибку:
#2002 Невозможно подключиться к серверу MySQL
Взять за основу вышеописанный вариант и пробовать решить проблему по устранению возникающей ошибки, — скорее всего, такие действия не принесут положительного результата.
Рабочая конфигурация my.cnf MySQL
Выбираем другой алгоритм. Для начала входим в MySQL через phpmyadmin. На домашней странице в phpmyadmin видим заголовок «Основные настройки», в подразделе «Сопоставление кодировки соединения с MySQL» выбираем UTF8_UNICODE_ci.
Далее проверим конфигурацию MySQL. В phpmyadmin выберем вкладку SQL и пошлем туда запрос вида:
SHOW VARIABLES LIKE ‘char%’;
в ответ имеем:
Variable_name
Value character_set_client utf8 character_set_connection utf8
character_set_database
latin1 character_set_filesystem binary character_set_results utf8
character_set_server
latin1 character_set_system utf8 character_sets_dir /usr/share/mysql/charsets/
Видим в приведенной конфигурации в двух местах значения latin1, которые необходимо исправить в зависимости от того, какая кодировка вам нужна. Допустим, мы будем заменять на cp1251, поэтому в конфигурационном файле my.cnf, который находится в каталоге /etc/mysql/my.cnf, ищем модуль [mysqld] и меняем его на:
[mysqld]
skip-character-set-client-handshake
character_set_client=cp1251
character_set_server=cp1251
Делаем рестарт MySQL (перезагрузку необходимо делать всегда после внесения каких-либо изменений): service mysql restart
В phpmyadmin снова посылаем SQL — запрос вида:
SHOW VARIABLES LIKE ‘char%’;
Получаем ответ, исходя из которого видим, что наша конфигурация MySQL поменялась:
Variable_name
Value character_set_client utf8 character_set_connection utf8
character_set_database
cp1251 character_set_filesystem binary character_set_results utf8
character_set_server
cp1251 character_set_system utf8 character_sets_dir /usr/share/mysql/charsets/
У нас latin1 поменялись на cp1251, соответственно сразу после приведения конфигурации MySQL к указанному виду, из базы у нас извлекается все корректно, наконец-то видим русские слова. Вот пример нашего текста, извлекаемого из БД MySQL.
От кодировки БД MySQL теперь переходим к настройкам кодировки сообщений, которые у нас с сайта отправляются на электронную почту, см. PHP отправка на e-mail >>>
Перевод записей БД MySQL из UTF-8 в Windows-1251
Я генерирую документ PDF с помощью FPDF. Этот документ должен содержать таблицу, которая берется из базы данных с русскими словами. Кодировка этих записей в базе — UTF-8.
Так как FPDF понимает только Windows-1251, ставится задача перевести из UTF-8 в Windows-1251, иначке в результирующем файле PDF будут одни кракозябры.
и многими другими способами — на выходе вообще нет никакого текста. Здесь $data[‘rank’] — соответствующее текстовое значение.
Перевести базу данных в Windows-1251 тоже не получается — перестают поддерживаться русские буквы вообще.
Пожалуйста, помогите разобраться.
Добавлено через 4 минуты
Результат такой. Ячейки должны быть заполнены текстом.
Перевод кодировки из utf-8 в windows-1251
Такая проблема: распарсил некоторый xml файл, у которого в атрибут значится кодировка utf-8. Затем.
Как создать рабочий XML в UTF-8? У меня исправно создаётся Windows-1251, но с UTF-8 проблема
Доброго дня, форумчане. Подскажите, что делать, чтобы создавался и открывался без ошибок.
UTF-16 -> cp-1251(windows-1251)
У меня есть кириллическая строка UTF-16, которая выглядит как Хотелось бы конвертнуть её в.
UTF-8 to WINDOWS-1251
Здравствуйте! Надо вот чего. Есть строка в UTF-8. После перекодировки функцией `UTF8ToString`.
Конвертация базы из Windows1251 в UTF8
Всем привет. Столкнулся с вопросом конвертации базы из CP1251 в UTF8.
Полазив по просторам Интернета не нашел готового скрита (видимо плохо искал).
Вот решил написать свой скриптп. Конвертация происходит безо всяких дампов базы. Решены проблемы с символами е = ё и т.д.
продолжение под катом
Пользуйтесь на здоровье.
Исправьте в начале скрипта открывающий тег. Хабр его режет, пришлось заэкранировать вопросик 😉
UPD:
По просьбам трудящихся описываю алгоритм работы:
1. Переименовываем таблицу во временную.
2. Берем описание таблицы. В ней меняем defaul charset на utf8. Ставим collate utf8_bin(делается, чтобы буквы нормлаьно перекодировались. И не было проблем с е = ё и т.д. Но есть 1 трабла — при сравнении строковых значений будет учитываться регистр).
3. Отключаем использование ключей(увеличивается скорость вставки). ALTER TABLE table_in_utf8 DISABLE KEYS;
4. Вставляем данные из таблицы, которая у нас в cp1251 в таблицу с кодировкой utf8. INSERT INTO table_in_utf8 SELECT * FROM table_in_cp1251;
5. Включаем использование ключей ALTER TABLE table_in_utf8 ENABLE KEYS;
Ну а скриптег написан для того, чтобы не делать все это ручками, если в вашем проекте очень много таблиц.
запускать скрипт можно из консоли `php -f export.php` или через веб.
$query = $create_table_scheme;
mysql_query($query);
$error = mysql_error();
if (strlen($error) > 0)
<
print $error.’ — LINE ‘.__LINE__.»\n»;
break;
>
$query = ‘ALTER TABLE ‘.$table_name.’ DISABLE KEYS’;
mysql_query($query);
$error = mysql_error();
if (strlen($error) > 0)
<
print $error.’ — LINE ‘.__LINE__.»\n»;
break;
>
$query = ‘INSERT INTO ‘.$table_name.’ SELECT * FROM ‘.$table_name.’_tmp_export’;
mysql_query($query);
$error = mysql_error();
if (strlen($error) > 0)
<
print $error.’ — LINE ‘.__LINE__.»\n»;
break;
>
$query = ‘DROP TABLE ‘.$table_name.’_tmp_export’;
mysql_query($query);
$error = mysql_error();
if (strlen($error) > 0)
<
print $error.’ — LINE ‘.__LINE__.»\n»;
break;
>
$time3 = microtime(true);
$query = ‘ALTER TABLE ‘.$table_name.’ ENABLE KEYS’;
mysql_query($query);
$error = mysql_error();
if (strlen($error) > 0)
<
print $error.’ — LINE ‘.__LINE__.»\n»;
break;
>
print ‘Enable keys to ‘.$table_name.’. time -‘.(microtime(true) — $time3).»\n»;
print ‘converted ‘.$table_name.’. time — ‘.(microtime(true) — $time1).»\n\n»;
print ‘done. total time -‘.(microtime(true) — $time);
?>
Исправление и изменение кодировок MySQL
В связи с тем, что довольно много людей обращается с просьбой помочь исправить проблему с кодировками MySQL, решил написать статью с описанием, как «лечить» наиболее часто встречающиеся случаи.
В статье описывается не то, как первоначально правильно настроить кодировки MySQL (об этом уже довольно много написано), а о случаях, когда есть довольно большие таблицы с неправильными кодировками и нужно всё исправить.
Самое плохое в неправильно настроенных кодировках — то, что зачастую проблему сложно обнаружить, и с первого взгляда может казаться, что сайт работает правильно, и никаких проблем нет.
Небольшое отступление. Sypex Viewer
В какой-то момент надоело отправлять людей в громоздкий phpMyAdmin, и была написана крошечная утилитка Sypex Viewer. Она представляет собой один PHP-файл, использует современные Web 2.0 технологии AJAX, JSON и другие. Основные задачи, которые ставилась при создании — минимальный вес, и максимальное удобство и скорость работы. В дальнейшем в примерах будут скриншоты из неё, но все те же действия можно сделать и в phpMyAdmin.
Данные в cp1251 таблицы в latin1
Наверное, самая популярная проблема. Когда данные в кодировке cp1251 (Windows-1251), а у таблиц указана кодировка по умолчанию latin1. Такие ситуации возникают в следующих случаях:
- при неграмотном обновлении с версии MySQL меньше 4.1 на более новые;
- очень часто возникает в «буржуйских» скриптах, которых вполне устраивает кодировка по умолчанию, и они «забывают», что неплохо бы указывать кодировку, как таблиц, так и соединения;
- также бывают случаи, когда переезжают с одного сервера (у которого установлена дефолтная кодировка cp1251, в частности, так сделано в Денвере) на другой (у которого стоит стандартная кодировка latin1).
В результате на сайте вроде как всё нормально, но если посмотреть в Sypex Viewer, то русские символы будут выглядеть как «кракозябры» (как их обычно называют пользователи).
В статье я рассмотрю один из вариантов преобразование кодировок с помощью бесплатного php-скрипта Sypex Dumper, в качестве готового решения.
- На вкладке «Экспорт» выбираем нужные таблицы.
- Кодировка должна быть auto (остальные параметры неважны, можно комментарий добавить, например, «Дамп перед исправлением кодировки»).
- Нажимаем «Выполнить». Теперь у нас есть бэкап (его в любом случае желательно делать при любых преобразованиях базы данных).
- Переходим на вкладку «Импорт»
- Выбираем только что сделанный файл бэкапа.
- Выбираем кодировку cp1251 и помечаем опцию «Коррекция кодировки».
- Нажимаем «Выполнить».
- Вот и всё заходим в Sypex Viewer, чтобы убедиться, что русские символы выводятся корректно.
Данные и таблицы в utf8, но кодировка соединения latin1
Теперь рассмотрим более запущенный случай. Набирающая популярность в последнее время проблема, в связи с повальным увлечением UTF-8. Создатели софта стали переводить свои детища на UTF-8, но и тут не всё так гладко, как хотелось бы.
Возникает проблема в основном в случае, когда у таблиц указана кодировка UTF-8, данные в UTF-8, но кодировка соединения установлена по умолчанию latin1 (типичный пример, vBulletin 4, хоть там и есть в конфигах настройка кодировки соединения, но она закомментирована по умолчанию).
В результате в MySQL присылаются данные в UTF-8, но поскольку указана кодировка соединения latin1, то MySQL пытается преобразовать данные из latin1 в UTF-8. В итоге русские символы выглядят так:
Ситуация более запущенная, но исправляется проблема почти также, как в первом случае, только в пункте 2 нужно выбрать кодировку latin1, а в пункте 6 нужно выбрать utf8 кодировку.
Изменение кодировки
Также часто встречающаяся проблема преобразования кодировки из cp1251 в UTF-8. До выполнения этого шага обязательно убедитесь, что русские символы у вас правильно показываются в Sypex Viewer или phpMyAdmin, если это не так, то предварительно исправьте кодировку.
Итак, опять заходим в Sypex Dumper.
- Во вкладке «Экспорт» выбираем нужные таблицы.
- Устанавливаем кодировку, в которую хотите преобразовать таблицы, в данном случае utf8.
- Нажимаем «Выполнить».
- После чего заходим в «Импорт» и выбираем нужный файл.
- Выставляем кодировку utf8 и опцию «Коррекция кодировки».
- Нажимаем «Выполнить».
- Вот и всё таблицы в UTF-8. Не забываем, что нужно еще установить кодировку соединения, сконвертировать ваши скрипты и шаблоны в UTF-8, выставить правильную кодировку в заголовках.
Кодировка соединения
Не забываем, что после исправлений кодировки, нужно убедиться, что ваши скрипты используют правильную кодировку соединения (в принципе, это будет сразу видно, они будут неправильно показывать русские символы без нужной кодировки соединения). У некоторых она выставляется в настройках, в некоторых придется добавить самостоятельно.
Для чего достаточно пройтись поиском по файлам, и найти где вызывается функция mysql_connect (или mysqli_connect). После этой строки нужно добавить строку которая укажет кодировку соединения.
Где вместо cp1251, указать нужную кодировку соединения.
Не забывайте перед преобразованиями кодировок делать бэкап, тут как с презервативами, лучше пусть он будет и не понадобится, чем когда понадобится — его не будет.