1

Тема: Опять кодировки! Давайте разберемся!

Гуглил - ответов много, но ни один не помогает. Поэтмоу решил начать заново тему, еще одна попытка решить извечную проблему.
Итак, есть некий php и mysql-server 5.0.45-1 (думаю детально версия не так важна).
Есть база данных с кодировкой utf8_general_ci, в ней есть русские тексты в полях данных. Есть CMS (пытался код посмотреть, не смог найти ничего такого особенного).

Теперь проблемная часть.
CMS русские тексты из базы отображает правильно.
phpMyAdmin и мои скрипты с прямыми обращениями к базе выводят кракозябры вида: ?????‚?°?????µ

Вопрос. Как лечить?

По мотивам нагугленных ответов, сразу отсеку неправильные варианты ответов.
1. Поскольку CMS отображает правильно, то ничего в самой базе и конфигах править НЕ НАДО!
2. set names utf8 - не помогает
3. set character set utf8 - не помогает
4.
set character_set_client='utf8'
set character_set_results='utf8'
set collation_connection='utf8_general_ci'
- не помогает
5. set session collation_server='utf8_general_ci' - не помогает

Что еще?

2

Re: Опять кодировки! Давайте разберемся!

bvn
1) Укажите используемую операционную систему и версию phpMyAdmin.
2) В phpMyAdmin выполните данный SQL запрос и покажите его вывод:

SHOW GLOBAL VARIABLES LIKE 'char%';

3

Re: Опять кодировки! Давайте разберемся!

1) Debian GNU/Linux, mysql-server версию указал в первом посте: 5.0.45-1
2) Variable_name     Value
character_set_client     latin1
character_set_connection     latin1
character_set_database     latin1
character_set_filesystem     binary
character_set_results     latin1
character_set_server     latin1
character_set_system     utf8
character_sets_dir     /usr/share/mysql/charsets/

4

Re: Опять кодировки! Давайте разберемся!

bvn
character_set_connection latin1 - Эта строка означает, что кодировка соединения с MySQL изначально устанавливается в latin1. Поэтому выходит следующее: данные со страницы сайта идут в БД в utf8, но MySQL принимает их как latin1 и засовывает в таблицы, из-за чего получаются крякозябы вида ?????‚?°?????µ (так отображается utf8 в latin1). Попробуйте на любом сайте в utf8 переключить в браузере кодировку отображения в latin1 (iso-8859-1) и увидите такие же крякозябы.

Теперь почему сайт нормально отображает кириллицу, если в БД крякозябы.
При выборке данных из БД кодировка соединения остается изначальная latin1, utf-8 переданный как latin1 в виде крякозябов попадает на страницу сайта с кодировкой utf-8 и получается то же самое, что при переключении кодировки в браузере обратно - кириллица становится читаема.

Однако надо понимать, что при некорректно установленной кодировке соединения с MySQL, в БД у вас крякозябы, а значит не будет работать поиск и сортировка (возможно что-то еще). Решением может быть перекодировка данных в корректный вид и последующая настройка кодировки соединения с MySQL в utf-8 с теперешнего latin1.

Перекодировка вещь сложная и ее надо рассматривать отдельно, если вы захотите ее осуществить.

Кодировка соединения с MySQL может устанавливаться глобально при доступе к конфигурационному файлу my.cnf, добавлением строки в раздел [mysqld]:

init-connect="SET NAMES utf8"

Возможно, что скрипт имеет конфигурационную директиву, которая предназначена для установки кодировки соединения с MySQL. Смотрите документацию скрипта. В этом случае потребуется только ее установить в utf8.

Однако установка кодировки соединения не перекодирует крякозябы, они такими и останутся, просто начнут отображаться на сайте в своем кривом виде.

5

Re: Опять кодировки! Давайте разберемся!

Огромное Вам человеческое спасибо за столь внятное разъяснение!
Получается, что это изначальный глюк этой самой CMS, которая, заполняя базу данными, не правильно установила кодировку, а при этом кажется, будто все работает хорошо. Действительно, установил в своем скрипте latin1 и увидел нормальные русские буквы, при обращении к базе этой CMS.
Разобрался, хочется верить, что раз и навсегда smile
Еще раз спасибо!