Кодировка, кракозяблы

Mysql поддерживает много кодировок и это нередко является головной болью для программистов. Самая частая проблема — кракозяблы вместо русского текста. Это происходит из за того, что текст либо лежит на сервере, либо отдается клиенту в неверной кодировке. Последнее(а иногда и первое) решается проще всего. Устанавливаем кодировку соединения (в utf8 в примере) сразу после установления соединения

Хуже, когда скрипт отдает в базу, данные в верной кодировке, а в ответ получаем кракозяблы или вопросики. Или когда часть таблиц в верной кодировке, часть нет.. В таких случаях придется разбираться детально.

Этот запрос обязательно проверять в самом скрипте, а не в phpmyadmin, где могут быть установлены другие параметры

  1. character_set_client — кодировка, в которой данные будут поступать от клиента
  2. character_set_connection — по умолчанию для всего, что в рамках соединения не имеет кодировки
  3. character_set_database — кодировка по умолчанию для баз
  4. character_set_filesystem — кодировка для работы с файловой системой (LOAD DATA INFILE, SELECT … INTO OUTFILE, и т.д.)
  5. character_set_results — кодировка, в которой будет выбран результат
  6. character_set_server — кодировка, в которой работает сервер
  7. character_set_system — идентификаторы MySQL, всегда UTF8
  8. character_sets_dir — папка с кодировками

По умолчанию после установки mysql сервер, который устанавливается ленивым хостером\админом имеет кодировку latin1. Соответственно указанные выше глобальные переменные будут в latin1. Базы соответственно по умолчанию и таблицы так же. И именно на это стоит обратить в самом начале обратить внимание, чтобы проблемы не всплывали позднее.

В идеальном варианте, нам следуетпривести все отмеченные цветом кодировки к единому значению. Тогда мы просто будем избавлены от мелких ошибок с кодировкой. Фактически, если мы работаем с хостингом, то на (3) и (6) мы повлиять не сможем. Но и это не страшно если настроены остальные три параметра. Mysql умет перекодировать на лету если правильно настроена кодировка соединения.

Ну и наконец, основной вопрос, что делать если одна из mysql таблиц(или несколько) в неверной кодировке и на сайте видны кракозяблы\вопросики?

1. Выяснить кодировку таблицы.

В этой таблице поле sName в кодировке latin1, если у нас соединение в другой кодировке, то мы увидим кракозябры.

2. Поэтому дальше проверим кодировку соединения, sql запросом SHOW VARIABLES LIKE 'character_set_client'. Замечу, что php функция mysqli_client_encoding(), нам не подойдет, так как она отображает кодировку только на момент соединения.

3. Если кодировка соединения не совпала с кодировкой одного из полей таблицы, то 2 очевидных варианта.
Если у нас все таблицы в одной кодировке, то проще поменять кодировку соединения .
А как исправить неверную кодировку поля таблицы?
Для этого выполним 2 запроса

Нельзя обойтись только вторым запросом. Важно выполнить оба. Первый преобразовывает данные в двоичные, второй запрос, преобразовывает данные в строковые сменив кодировку.. Т.е. по сути мы не измениили двоичные данные, мы изменили правило формирования символов.  Если бы мы попробовали обойтись только вторым запросом, то получили бы ошибочный набор.

You may also like...

  • А для чего в рамках одной таблицы разные кодировки? О_О

    • старый проект, когда то оказалось проще добавить поле
      было без разницы в какой оно кодировке потому что изначально туда писался только транслит

  • Спасибо Ваш сайт меня спас. Установил mysql_set_charset(‘utf8’); и все заработало.

  • спасибо

  • Ли Вонг

    спасибо

  • Подскажите плс, где найти:
    character_set_client cp1251
    character_set_connection cp1251
    character_set_results cp1251

    Есть проблема с кракозябрами с базой (Буква «И») на форуме IPB. Изменение $INFO[‘sql_charset’] = ‘utf8’; вешает форум.

    Вопрос, ламерский, сам знаю, но если не затруднит чиркните кто-нибудь.

    • Уже нашел, кто так же, как и ищет, где это — смотрите в панели phpMyAdmin вкладка SQL, где выполняете запросы к базе
      SHOW VARIABLES LIKE ‘одно из выражений ниже’
      character_set_client
      character_set_connection
      character_set_results

      Так же с запросом SHOW CREATE TABLE

  • Спасибо! Решило проблему.