Ошибка! Кодировки таблиц имеют ошибки, общее число ошибок: 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 заключается в поддерживаемых символах и способе хранения данных:
Поддержка символов:
utf8mb3
: Эта кодировка поддерживает символы, которые занимают до трех байт. Это означает, что она может хранить большинство символов, используемых в современных языках, но не может обрабатывать некоторые символы, такие как эмодзи и определенные символы из языков, требующих четырех байтов.utf8mb4
: Эта кодировка поддерживает все символы Unicode, включая те, которые занимают четыре байта, такие как эмодзи и редкие иероглифы.
Длина хранения:
utf8mb3
: Максимальная длина строки составляет 3 байта на символ, что делает максимальную длину строки в 767 байт для индексов (в версиях до MySQL 5.7).utf8mb4
: Максимальная длина строки составляет 4 байта на символ, что позволяет хранить более длинные строки и обеспечивает большую гибкость для хранения различных символов.
Рекомендации по использованию:
- Рекомендуется использовать
utf8mb4
вместоutf8mb3
для новых проектов, чтобы обеспечить полную поддержку всех символов Unicode и избежать потенциальных проблем с совместимостью в будущем.
- Рекомендуется использовать
Таким образом, если проект требует поддержки эмодзи или других специальных символов, utf8mb4
— лучший выбор.
Ответ Технической поддержки 1С-Битрикс на данную проблему
Ситуация связана с тем, что сейчас проверка не учитывает кодировку "utf8mb4"/"utf8mb3" как исключение и выдает замечание в результате теста. В отделе разработок есть заявка по этой ситуации. Срок решения полностью зависит от планов и загруженности отдела разработок. Но как только будут новости, мы сразу вас уведомим.
В качестве решения можно обратиться к администратору вашего сервера, для того чтобы со стороны СУБД изменить кодировку соответствующих таблиц в "utf8". Отмечу, что в данном случае необходимо наличие актуальной резервной копии системы и актуального валидного бэкапа сервера, чтобы в случае необходимости произвести восстановление. После этого можно запустить тестирование конфигурации повторно и проверить изменилась ли указанная ситуация.
На работу сайта этот момент с кодировкой не влияет.
Ждать обновлений не будем, переходим к изменению кодировки таблицы:
- Создаем резервную копию базы данных, чтобы мы могли в любой момент вернуться в первоначальному ее состоянию. Далее все действия будем проводить на рабочей базе.
- Меняем кодировку базы данных:
Для того чтобы изменить кодировку будем использовать команду
ALTER TABLE
.Шаги выполнения в PHPMyAdmin: Откройте вашу базу данных в PHPMyAdmin Перейдите на вкладку SQL Вставьте запрос
ALTER DATABASE `имя_вашей_базы` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
Нажмите Выполнить Проверьте изменения - Меняем параметры подключения в
/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"'); - Возвращаемся в Настройки - Инструменты - Проверка системы и запускаем тестирование
в "Кодировки таблиц в БД" может появиться такая ошибка:
Ошибка! Кодировки таблиц имеют ошибки, общее число ошибок: 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) .....
- Повторяем действия в шаге №2, только меняем сами запросы. Теперь нам нужно у таблиц (не полей) имеющих кодировку
utf8mb3
поменять ее наutf8mb4
.Пример запроса: ALTER TABLE `b_abtest` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
- Опять возвращаемся в Настройки - Инструменты - Проверка системы и запускаем тестирование. Проверяем, чтобы в "Кодировки таблиц в БД" отсутствовали ошибки, но в следующем блоке "Структура базы данных" они могут появится
Ошибка! Структура базы данных имеет ошибки. Всего 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" .....
- Опять повторяем действия в шаге №2, только меняем запросы. Теперь нам нужно изменить информацию о описании полей.
Пример запроса: ALTER TABLE `b_event_type` CHANGE `DESCRIPTION` `DESCRIPTION` text NULL DEFAULT NULL;
- Опять возвращаемся в Настройки - Инструменты - Проверка системы и запускаем тестирование. Проверяем, чтобы не было никаких ошибок при Тестирование базы данных
- Последний шаг. Запускаем Оптимизацю БД средствами Битрикса.
Переходим в Настройки - Инструменты - Диагностика - Оптимизация БД Нажимаем Выполнить и дожидаемся результата
- На этом процедура по смене кодировки базы данных c
utf8mb3
наutf8mb4
завершена.