08.10.2024 Уже прочитали 4997 раз Помогло 1 читателям

Кодировка поля "SITE_ID" таблицы "b_abtest" (utf8) отличается от кодировки базы (utf8mb3)

При тестировании проверки системы в "Кодировки таблиц в БД" появилась такая ошибка:
Ошибка! Кодировки таблиц имеют ошибки, общее число ошибок: 2725, из них автоматически могут быть исправлены: 0.

Смотрим подробности в журнале проверки системы и видим такие сообщения:

Кодировка поля "SITE_ID" таблицы "b_abtest" (utf8) отличается от кодировки базы (utf8mb3)
Кодировка поля "ACTIVE" таблицы "b_abtest" (utf8) отличается от кодировки базы (utf8mb3)
Кодировка поля "ENABLED" таблицы "b_abtest" (utf8) отличается от кодировки базы (utf8mb3)
Кодировка поля "NAME" таблицы "b_abtest" (utf8) отличается от кодировки базы (utf8mb3)
Кодировка поля "DESCR" таблицы "b_abtest" (utf8) отличается от кодировки базы (utf8mb3)
Кодировка поля "TEST_DATA" таблицы "b_abtest" (utf8) отличается от кодировки базы (utf8mb3)
Кодировка поля "MODULE_ID" таблицы "b_admin_notify" (utf8) отличается от кодировки базы (utf8mb3)
Кодировка поля "TAG" таблицы "b_admin_notify" (utf8) отличается от кодировки базы (utf8mb3)
.....
Эта ошибка возникает из-за того, что в базе данных MySQL используются разные кодировки между таблицами и полями. В нашем случае кодировка полей — utf8, тогда как кодировка базы данных — utf8mb3.

В чем разница?

Разница между utf8mb3 и utf8mb4 в MySQL заключается в поддерживаемых символах и способе хранения данных:

  1. Поддержка символов:

    • utf8mb3: Эта кодировка поддерживает символы, которые занимают до трех байт. Это означает, что она может хранить большинство символов, используемых в современных языках, но не может обрабатывать некоторые символы, такие как эмодзи и определенные символы из языков, требующих четырех байтов.
    • utf8mb4: Эта кодировка поддерживает все символы Unicode, включая те, которые занимают четыре байта, такие как эмодзи и редкие иероглифы.
  2. Длина хранения:

    • utf8mb3: Максимальная длина строки составляет 3 байта на символ, что делает максимальную длину строки в 767 байт для индексов (в версиях до MySQL 5.7).
    • utf8mb4: Максимальная длина строки составляет 4 байта на символ, что позволяет хранить более длинные строки и обеспечивает большую гибкость для хранения различных символов.
  3. Рекомендации по использованию:

    • Рекомендуется использовать utf8mb4 вместо utf8mb3 для новых проектов, чтобы обеспечить полную поддержку всех символов Unicode и избежать потенциальных проблем с совместимостью в будущем.

Таким образом, если проект требует поддержки эмодзи или других специальных символов, utf8mb4 — лучший выбор.

Ответ Технической поддержки 1С-Битрикс на данную проблему

Ситуация связана с тем, что сейчас проверка не учитывает кодировку "utf8mb4"/"utf8mb3" как исключение и выдает замечание в результате теста. В отделе разработок есть заявка по этой ситуации. Срок решения полностью зависит от планов и загруженности отдела разработок. Но как только будут новости, мы сразу вас уведомим.

В качестве решения можно обратиться к администратору вашего сервера, для того чтобы со стороны СУБД изменить кодировку соответствующих таблиц в "utf8". Отмечу, что в данном случае необходимо наличие актуальной резервной копии системы и актуального валидного бэкапа сервера, чтобы в случае необходимости произвести восстановление. После этого можно запустить тестирование конфигурации повторно и проверить изменилась ли указанная ситуация.

На работу сайта этот момент с кодировкой не влияет.

Ждать обновлений не будем, переходим к изменению кодировки таблицы:

  1. Создаем резервную копию базы данных, чтобы мы могли в любой момент вернуться в первоначальному ее состоянию. Далее все действия будем проводить на рабочей базе.
  2. Меняем кодировку базы данных: Для того чтобы изменить кодировку будем использовать команду ALTER TABLE.
    Шаги выполнения в PHPMyAdmin:
    Откройте вашу базу данных в PHPMyAdmin
    Перейдите на вкладку SQL
    Вставьте запрос ALTER DATABASE `имя_вашей_базы` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
    Нажмите Выполнить
    Проверьте изменения
    
  3. Меняем параметры подключения в /bitrix/php_interface:.
    в after_connect.php:
    вместо: 
    $DB->Query("SET NAMES 'utf8'");
    $DB->Query('SET collation_connection = "utf8_unicode_ci"');
    
    указываем: $DB->Query("SET NAMES 'utf8mb4'"); $DB->Query('SET collation_connection = "utf8mb4_general_ci"');

    в after_connect_d7.php:
    вместо: 
    $this->queryExecute("SET NAMES 'utf8'");
    $this->queryExecute('SET collation_connection = "utf8_unicode_ci"');
    
    указываем: $this->queryExecute("SET NAMES 'utf8mb4'"); $this->queryExecute('SET collation_connection = "utf8mb4_general_ci"');
  4. Возвращаемся в Настройки - Инструменты - Проверка системы и запускаем тестирование
    в "Кодировки таблиц в БД" может появиться такая ошибка:
    Ошибка! Кодировки таблиц имеют ошибки, общее число ошибок: 2725, из них автоматически могут быть исправлены: 0

    Смотрим подробности в журнале проверки системы и видим такие сообщения:

    Кодировка таблицы "b_abtest" (utf8mb3) отличается от кодировки базы (utf8mb4)
    Кодировка поля "SITE_ID" таблицы "b_abtest" (utf8) отличается от кодировки базы (utf8mb4)
    Кодировка поля "ACTIVE" таблицы "b_abtest" (utf8) отличается от кодировки базы (utf8mb4)
    Кодировка поля "ENABLED" таблицы "b_abtest" (utf8) отличается от кодировки базы (utf8mb4)
    Кодировка поля "NAME" таблицы "b_abtest" (utf8) отличается от кодировки базы (utf8mb4)
    Кодировка поля "DESCR" таблицы "b_abtest" (utf8) отличается от кодировки базы (utf8mb4)
    Кодировка поля "TEST_DATA" таблицы "b_abtest" (utf8) отличается от кодировки базы (utf8mb4)
    .....
    
  5. Повторяем действия в шаге №2, только меняем сами запросы. Теперь нам нужно у таблиц (не полей) имеющих кодировку utf8mb3 поменять ее на utf8mb4.
    Пример запроса:
    ALTER TABLE `b_abtest` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
    
  6. Опять возвращаемся в Настройки - Инструменты - Проверка системы и запускаем тестирование. Проверяем, чтобы в "Кодировки таблиц в БД" отсутствовали ошибки, но в следующем блоке "Структура базы данных" они могут появится
    Ошибка! Структура базы данных имеет ошибки. Всего 314, автоматически могут быть исправлены: 0.

    Смотрим подробности в журнале проверки системы и видим такие сообщения:

    В таблице b_event_type поле DESCRIPTION "`DESCRIPTION` mediumtext NULL DEFAULT NULL" не соответствует описанию на диске "`DESCRIPTION` text NULL DEFAULT NULL"
    В таблице b_event_message поле BCC "`BCC` mediumtext NULL DEFAULT NULL" не соответствует описанию на диске "`BCC` text NULL DEFAULT NULL"
    В таблице b_event_message поле ADDITIONAL_FIELD "`ADDITIONAL_FIELD` mediumtext NULL DEFAULT NULL" не соответствует описанию на диске "`ADDITIONAL_FIELD` text NULL DEFAULT NULL"
    В таблице b_group поле SECURITY_POLICY "`SECURITY_POLICY` mediumtext NULL DEFAULT NULL" не соответствует описанию на диске "`SECURITY_POLICY` text NULL DEFAULT NULL"
    В таблице b_user поле PERSONAL_STREET "`PERSONAL_STREET` mediumtext NULL DEFAULT NULL" не соответствует описанию на диске "`PERSONAL_STREET` text NULL DEFAULT NULL"
    В таблице b_user поле PERSONAL_NOTES "`PERSONAL_NOTES` mediumtext NULL DEFAULT NULL" не соответствует описанию на диске "`PERSONAL_NOTES` text NULL DEFAULT NULL"
    .....
    
  7. Опять повторяем действия в шаге №2, только меняем запросы. Теперь нам нужно изменить информацию о описании полей.
    Пример запроса:
    ALTER TABLE `b_event_type` CHANGE `DESCRIPTION` `DESCRIPTION` text NULL DEFAULT NULL;
    
  8. Опять возвращаемся в Настройки - Инструменты - Проверка системы и запускаем тестирование. Проверяем, чтобы не было никаких ошибок при Тестирование базы данных
  9. Последний шаг. Запускаем Оптимизацю БД средствами Битрикса.
    Переходим в Настройки - Инструменты - Диагностика - Оптимизация БД
    Нажимаем Выполнить и дожидаемся результата
    
  10. На этом процедура по смене кодировки базы данных c utf8mb3 на utf8mb4 завершена.
Обратная связь

Материал был полезен?

Оценка помогает понимать, какие материалы стоит развивать и дополнять.

Обсудить задачу

Обратиться за помощью

Опишите задачу и оставьте контакты. Я посмотрю вводные и свяжусь с вами удобным способом.

Направление *