Найти в Дзене

В MySQL знаки вопросов вместо русских букв — решение проблемы с кодировкой

Оглавление

📊 ZEL-Услуги Инфоблок Статьи

При переносе дампа или после нескольких манипуляций в базе неожиданно появились знаки вопросов в MySQL вместо русских букв? Это известная и распространённая проблема в MySQL старших версий.

🟥 Это руководство поможет предпринять быстрые шаги в исправлении ситуации.

Мы рассмотрим конкретные действия для быстрого решения. Обратите внимание на официальное руководство по кодировке в MySQL, чтобы вы смогли разбираться в сути и выполнять рекомендации осознанно.

Исправляем знаки вопросов в MySQL на русские буквы

Воспользуйтесь этими быстрыми рекомендациями, чтобы отобразить русские буквы без знаков вопросов и «крякозябр». Ниже мы привели некоторые уточнения.

  1. Дождитесь выполнения соединения с сервером
  2. Введите запрос:
    set names кодировка

    «кодировка» — это параметр кодировки, в которой вы выводите данные страницы на сайте.

    То есть запрос для UTF-8 должен выглядеть так:
    set names utf8

    А для Windows-1251 вот так:
    set names cp1251
  3. Очень часто параметр «Set Names» не помогает решить проблему кодировки при сортировке по имени, хотя буквы отображаются нормально. Как это исправить, читайте далее.
-2

Обратите внимание, что запросы «set names» по факту не влияют на кодировку, которая используется функцией mysql_real_escape_string. Поэтому рекомендуется применять установку кодировки через mysql_set_charset() вместо запроса «set names». Но даже если вы проигнорируете эту рекомендацию, то для Uta8 и других однобайтных кодировок ничего плохого не последует.

Чтобы не задавать кодировку в каждом скрипте, допишите в my.ini
[mysqld]
init-connect='SET NAMES utf8'

-3

Исправление проблемы кодировки MySQL, если запрос SET NAMES не помог

Перед тем, как изменить кодировку MySQL, вновь выполните запрос «Set Names», но уже с указанием кодировки таблицы (мы должны её выяснить).

  1. Причина кроется в том, что для таблиц настройка в одной кодировке, а данные в них — в другой.
  2. Попробуйте начать с простого решения — того же запроса «Set Names», но в кодировке таблицы.
  3. Для этого задайте запрос для названия вашей таблицы:
    show create table `table`
  4. Используйте полученную кодировку в запросе «Set Names»:
    SET NAMES кодировка

    «кодировка» — это параметр, который показал результат запроса «
    Show Create Table» из пункта 3 (DEFAULT CHARSET=кодировка).
  5. Так вы уберёте «крякозябры» и знаки вопросов из MySQL, настроите правильную отдачу и запись русских букв в данных (главное, чтобы у самой веб-страницы была соответствующая кодировка), но проблему сортировки и поиска пока не решите. Идём дальше.

Теперь, зная кодировку таблицы (например, latin1) и имея данные в той же кодировке, мы должны изменить фактическую кодировку данных.

  1. Через mysqldump создайте дамп базы данных.
  2. Используйте эту команду, в которой вместо слова «кодировка» вставьте параметр, выясненный из кодировки таблицы:
    mysqldump -uUSERNAME -pPASSWORD DB_NAME --allow-keywords --create-options --complete-insert --default-character-set=кодировка --add-drop-table > dump.sql
  3. Главное не перепутать кодировку таблиц с кодировкой данных.
  4. Проверьте дамп на правильное отображение кодировки уже в формате данных таблицы, а не самой таблицы, как в пункте 3 (то есть уже не latin1, а utf8, например). Скопируйте бэкап дампа отдельно.
  5. В дампе найдите оператор «Create Database» и проверьте, правильная ли в нём кодировка.
  6. Если нет, то исправьте. Тоже самое можно (и лучше сделать) с оператором «Create Table».
  7. Используйте эту команду для заливки дампа, где «кодировка» — параметр данных таблицы (utf8, а не latin1 из нашего примера):
    mysql -uUSERNAME -pPASSWORD DB_NAME --default-character-set=utf8 < dump.sql
  8. На веб-странице сайта найдите функцию mysql_connect, затем mysql_select_db и ниже их размещения добавьте строчку, где «кодировка» — это параметр данных таблицы, а не самой таблицы:
    mysql_query("SET NAMES кодировка")

Ничего не помогает, проблема кодировки MySQL так и осталась

Объёмный wiki-раздел по кодировке MySQL составили белорусские коллеги, где вы можете получить исчерпывающее описание процесса правильного создания баз данных и таблиц. Ведь именно в этом процессе кроются все причины возникновения проблемы со знаками вопросов MySQL и «крякозябрами» вместо русских букв.

Также обратите внимание и на эти моменты при работе с базами данных

  • правильная ли задана кодировка при создании таблиц (можно использовать любую, но она должна отражать кодировку данных в таблице);
  • правильная ли кодировка у скрипта, работающего с базой данных (кодировка веб-страницы и скрипта должна быть одной);
  • правильная ли кодировка у самого сайта (у веб-страницы и заголовка «Content-Type» сайта она должна быть общая);
  • в правильной ли кодировке сохраняются данные на веб-странице через редактор (выберите в редакторе нужную кодировку, следите за этим).
-5

Не хотите самостоятельно разбираться в настройке MySQL и оптимизировать работу ИТ-инфраструктуры предприятия?

Передайте заботы о программном обеспечении в компанию ИТ-аутсорсинга ZEL-Услуги с полноценным ИТ-аудитом и экспертной поддержкой по любым техническим вопросам и задачам.