Неверная кодировка в MySql из PHP. Вопросы вместо слов

Пишу свой первый сайт на PHP с использованием базы данных Mysql и столкнулся со следующей неожиданностью, о которой ниже, а для начала вводные данные:

  • сайт делается в кодировке utf8, о чем указано в заголовке страницы между тегами head:
    <meta http-equiv="content-type" content="text/html; charset=utf-8">
  • страница создается в редакторе в кодировке utf8
  • сама база создана с указанием кодировки utf8

При этом получилось так, что при извлечении данных из базы я получал вместо строк с русским текстом знаки вопросов, хотя браузер правильно понимал кодировку.
Решение данной проблемы оказалось простым. Надо после соединения с MySql базой из PHP указать явную кодировку запросом set names utf8
Например, так:

$result = mysql_query ("set names utf8", $link);

где $link — линк на идентификатор соединения с базой (см. mysql_connect())
Всё, теперь данные выводятся в верной кодировке.
Вообще-то эта проблема имеет и другие корни с соответственно другими методами решения. Более подробно о проблемах с кодировками в MySQL можно почитать в следующих источниках:

  1. phpMyadmin по-русски. Очень доходчиво, по полочкам все разложено и в доступной краткой форме.
  2. PHP FAQ. Так же полезная информация, но еще рассказывается что делать если требуется перекодировка данных.
  3. Linux.by wiki pages. А это вообще целый вики на эту тему.

Неверная кодировка в MySql из PHP. Вопросы вместо слов: 4 комментария

  1. я скажу даже больше. иногда, по непонятной мне причине, простого «set names» не достаточно. тогда приходится выполнять еще и такие команды после установки соединения с базой:
    set characters_set_client=’utf8′;
    set characters_set_results=’utf8′;
    set collation_connection=’utf8_general_ci’;

    если сервер ваш, то можно в конфиг my.cnf добавить:

    init_connect=’SET collation_connection=utf8_general_ci’
    init_connect=’SET NAMES utf8′
    default-character-set=utf8
    character-set-server=utf8
    collation-server=utf8_general_ci

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *