utf-8, mysql и буквы ш, И - некорректно отображаются буквы

На некоторых конфигурациях хостинга php вместо буквы “ш” (вообще, такой недостаток есть у двух букв - «ш» маленькая и «И» большая) выдавал “ерунду” - две кракозябры (видимо, непечатаемые символы). Иногда (возможно, после применения iconv) слова, содержащие букву “ш” вообще могли “пропасть”. Сайт в кодировке utf-8, база - также в utf-8. Проблема оказалась не в php (под подозрением находился iconv - на некоторых хостингах бывали проблемы с функциями перекодировки).

После сравнительно недолгих поисков выяснилось, что  «ш» и «И», словно заколдованные буквы могут некорректно работать с базой в кодировке utf-8.

Решить все удалось очень просто - после соединения с базой нужно установить кодировку для:
SET CHARACTER SET ‘utf8′ –(этот вариант нашел в рекомендациях на нескольких форумах)
SET NAMES ‘utf8′ –(этот вариант помог)

(важно! именно utf8, а не utf-8 - вариант с дефисом как раз и выдавал результат)

Можно “подглядеть”, что творится на сервере с кодировками:

mysql> show variables like '%char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

php и utf8 - http://www.phpwact.org/php/i18n/utf-8

После переноса или смены кодировки некоторые буквы “ш” и “И” в UTF-8 могут отображаться неверно
буква “ш” = chr(209).chr(63) / правильно chr(209).chr(136)
буква “И” = chr(208).chr(63) / правильно chr(208).chr(152)
Для решения проблемы выполняем запросы (в phpmyadmin)

UPDATE `table` SET `field` = REPLACE(
`field`,
CONCAT( CHAR(209), CHAR(63) ),
CONCAT( CHAR(209), CHAR(136) )
);

UPDATE `table` SET `field` = REPLACE(
`field`,
CONCAT( CHAR(208), CHAR(63) ),
CONCAT( CHAR(208), CHAR(152) )
);

Метки:

Автор будет признателен, если Вы поделитесь ссылкой на статью, которая Вам помогла:
BB-код (для вставки на форум)

html-код (для вставки в ЖЖ, WP, blogger и на страницы сайта)

ссылка (для отправки по почте)

Комментарии (6) к записи “utf-8, mysql и буквы ш, И - некорректно отображаются буквы”

  1. WordPress Video сообщает :

    WordPress Video…

    Many thanks for yet an additional first-rate article. I am always scouring the web for super WordPress ideas to recommend to my own readers. Thank you for creating this article. It’s precisely what I was searching for. Truly terrific post….
    {spam_detected}
    wordpressvideos.tv

  2. Asagi сообщает :

    Аааа! Спасибо! Выручил своей статьей)))
    _yumeki.ru

  3. Hack Info Module for joomla сообщает :

    Hack Info Module for joomla…

    Good info on utf-8, mysql и буквы ш, И - некорректно отображаются буквы … ? Although most of the information provided is true as per my knowledge but I don’t agree fully. I think it should be more practical. I vis…
    {spam_detected}

  4. Alex Solo сообщает :

    Спасибище!!!!! Ещё бы одну ночь на поиски потратил, а ща фсё бегает правильно! Респект и уважуха!

  5. Игорь сообщает :

    подскажите в каком файле надо прописать?

  6. levik сообщает :

    Не в файле, в запросе..

    В зависимости от используемой CMS или фреймворка может быть несколько вариантов
    Самый оптимальный вариант - сразу после подключения к базе.

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