Проблемы кодировки символов: MySQL 5.0 + PHP 5.2

У меня есть база данных MySQL с таблицей InnoDB, содержащей поля utf8_general_ci varchar. Когда я получаю их через PHP (через PEAR::MDB2) и пытаюсь вывести их (через Smarty), я получаю??? символы. Я хотел бы знать, как решить эту проблему, которая, скорее всего, вызвана PHP.

Хорошая информация, чтобы знать:

  • Это новая версия сайта, над которой я работаю, у старой версии была та же проблема, хотя она не использовала ни Smarty, ни MDB2, поэтому они, скорее всего, не причина. Старый программист использовал htmlentities(), чтобы исправить проблему, но я пытаюсь избежать этого.
  • Кодировка символов всех моих файлов (шаблон, источник и т. Д.) - UTF-8 без спецификации.
  • Когда я отображаю страницу, все акцентированные символы (те, что в шаблонах, а не те, что исходят из MySQL) отображаются правильно, а кодировка в браузере - UTF-8. Если я вручную переключу его на ISO-8859-1, то символы из MySQL будут правильно выведены, но остальные нет.

По сути, кажется, что PHP или MySQL преобразует данные UTF-8, содержащиеся в базе данных, в ISO-8859-1 в какой-то момент в процессе запроса / выборки, и это то, что я хочу исправить.

Я много занимался поиском, но не нашел решения, и надеюсь, что проблема где-то в настройке. Я хотел бы избежать использования htmlentities() или utf8_encode(), однако это может быть единственным способом, пока не появится PHP6.

Спасибо за ваш вклад в это!

2 ответа

Решение

Вам нужно выполнить несколько запросов, чтобы указать ему использовать UTF-8 для соединения (по умолчанию действительно Latin-1). Вот что я использую:

SET CHARACTER SET = "utf8";
SET character_set_database = "utf8";
SET character_set_connection = "utf8";
SET character_set_server = "utf8";

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

Я предполагаю, что данные не были в кодировке utf-8, когда попали в базу данных.

Другие вопросы по тегам