Проблема с кодировкой при чтении из БД (MySQL, PHP)

Это довольно часто возникающий вопрос у начинающих. Причем, если мы говорим о местных сервисах, предоставляющих хостинг, то в первую очередь там реализована поддержка cp1251, и иногда могут проявиться проблемы, если у вас БД использует за базис UTF8, с иностранными хостерами наоборот. На самом деле все решается довольно просто. При каждом коннекте к базе нужно прописывать запрос типа: mysql_query("SET NAMES utf8"); или же mysql_query("SET NAMES ‘cp1251’");, в зависимости от того, что вам нужно. Таким образом, стандартная функция запроса в коде PHP, например, должна выглядеть так…

function get_article($id)
    {
        db_connect();//ф-я подключения к БД
        mysql_query("SET NAMES utf8");
        $query = ("SELECT * FROM articles WHERE id='$id' ");
        $result = mysql_query($query);
        $row = mysql_fetch_array($result);
        return $row;
    }

В случае, когда данный вариант не поможет, можно использовать строки, например, для случая с переходом на cp1251:

mysql_query("SET NAMES 'cp1251'");
mysql_query("SET CHARACTER SET 'cp1251'");

Если у вас есть доступ к файлу конфигурации MySQL на сервере, то запросы, организованные таким образом являются излишними.  Достаточно указать базовую кодировку в конфигурационном файле my.cnf. В разделе [mysqld] вводим:

 

default-character-set=cp1251
character-set-server=cp1251
collation-server=cp1251_general_ci
init-connect=»SET NAMES cp1251?
skip-character-set-client-handshake

А в раздел [mysqldump] прописываем строку:

default-character-set=cp1251

Кристофер

christopher@tut.by

http://itcs.3dn.ru

Версия для печатиВерсия для печати

Рубрики: 

  • 1
  • 2
  • 3
  • 4
  • 5
Всего голосов: 0
Заметили ошибку? Выделите ее мышкой и нажмите Ctrl+Enter!

Читайте также

 

Комментарии

Аватар пользователя Petro42

Автор забыл напомнить, что надо обязательно перекодировать все уже созданные до этого в базе таблицы, иначе потом на сайте чёрт ногу сломит. 

Большое спасибо, это сработало:
mysql_query("SET NAMES 'cp1251'");