Недавно я столкнулся с проблемой.
Создал базу данных и в ней таблицу. Во время создания явно задал кодировку (utf-8).
После этого, установил и настроил CodeIgniter. Все представления (views) тоже были в кодировке utf-8, и, естественно, был добавлен мета-тег:
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
Т.е. кириллица в браузере отображалась правильно.
Начинаю добавлять данные в БД (с помощью scaffolding). Все отлично работает, буквы отображаются правильно.
Но, через некоторое время мне понадобилось сделать дамп базы. Запускаю phpMyAdmin, экспортирую базу и вижу вместо кириллицы «кракозябры»! При просмотре данных в phpMyAdmin – те же «кракозябры». Ввожу данные через phpMyAdmin – в нем все нормально, но на сайте – знаки вопроса.
Если бы этот дамп был нужен лично мне, я бы не стал заморачиваться. Но я хотел поместить его в этом блоге, и такой вариант меня не устраивал.
Самое непонятное заключалось в том, что тут же была база данных, созданная WordPress, с теми же самыми кодировками. И в ней все работало отлично, и на сайте, и в phpMyAdmin.
В общем, после недолгих поисков, решение нашлось. Предложил его mihailt.
Идея заключается в том, что нужно выполнить “SET NAMES UTF8
” для каждого соединения.
Для это в конфигурационный файл базы данных (/system/application/config/database.php
) добавляем
$db[‘default’][‘charset’] = "UTF8";
А в файле /system/database/DB.php добавляем строку
$DB->query(“SET NAMES ?”, $params[‘charset’]);
(сразу после $DB =& new $driver($params);
).
Все тут же отлично заработало.
Для справки. Кодировки БД были такими:
character_set_client – utf8
character_set_connection – utf8
character_set_database – utf8
character_set_filesystem – binary
character_set_results – utf8
character_set_server – utf8
character_set_system – utf8
collation_connection – utf8_unicode_ci
collation_database – utf8_general_ci
collation_server – utf8_general_ci
Примечание. Эти данные можно получить с помощью запросов
SHOW VARIABLES LIKE 'character%' SHOW VARIABLES LIKE 'collation%'