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

Описание проблемы:

После переноса сайта на новый сервер, вы можете столкнуться с сообщением об ошибке, подобным следующему:

Ошибка
Кодировки таблиц в БД (check_mysql_table_charset): Fail
Кодировка таблицы "b_abtest" (utf8mb4) отличается от кодировки базы (utf8mb3)
Кодировка поля "SITE_ID" таблицы "b_abtest" (utf8mb4) отличается от кодировки базы (utf8mb3)
Кодировка поля "ACTIVE" таблицы "b_abtest" (utf8mb4) отличается от кодировки базы (utf8mb3)
Кодировка поля "ENABLED" таблицы "b_abtest" (utf8mb4) отличается от кодировки базы (utf8mb3)
Кодировка поля "NAME" таблицы "b_abtest" (utf8mb4) отличается от кодировки базы (utf8mb3)
Кодировка поля "DESCR" таблицы "b_abtest" (utf8mb4) отличается от кодировки базы (utf8mb3)
Кодировка поля "TEST_DATA" таблицы "b_abtest" (utf8mb4) отличается от кодировки базы (utf8mb3)
Кодировка таблицы "b_translate_phrase_fts_en" (utf8mb4) отличается от кодировки базы (utf8mb3)
Кодировка поля "PHRASE" таблицы "b_translate_phrase_fts_en" (utf8mb4) отличается от кодировки базы (utf8mb3)
Кодировка таблицы "b_utm_iblock_3_section" (utf8mb4) отличается от кодировки базы (utf8mb3)
Кодировка поля "VALUE" таблицы "b_utm_iblock_3_section" (utf8mb4) отличается от кодировки базы (utf8mb3)
Кодировка таблицы "b_uts_iblock_3_section" (utf8mb4) отличается от кодировки базы (utf8mb3)
Кодировка поля "UF_TM_MAX_START" таблицы "b_uts_iblock_3_section" (utf8mb4) отличается от кодировки базы (utf8mb3)
Кодировка поля "UF_TM_MIN_FINISH" таблицы "b_uts_iblock_3_section" (utf8mb4) отличается от кодировки базы (utf8mb3)
Кодировка поля "UF_TM_MIN_DURATION" таблицы "b_uts_iblock_3_section" (utf8mb4) отличается от кодировки базы (utf8mb3)
Кодировка поля "UF_TM_REPORT_TPL" таблицы "b_uts_iblock_3_section" (utf8mb4) отличается от кодировки базы (utf8mb3)
Кодировка поля "UF_TM_TIME" таблицы "b_uts_iblock_3_section" (utf8mb4) отличается от кодировки базы (utf8mb3)
Кодировка поля "UF_TM_DAY" таблицы "b_uts_iblock_3_section" (utf8mb4) отличается от кодировки базы (utf8mb3)
Кодировка поля "UF_TM_REPORT_DATE" таблицы "b_uts_iblock_3_section" (utf8mb4) отличается от кодировки базы (utf8mb3)
Кодировка поля "UF_DELAY_TIME" таблицы "b_uts_iblock_3_section" (utf8mb4) отличается от кодировки базы (utf8mb3)
Кодировка поля "UF_LAST_REPORT_DATE" таблицы "b_uts_iblock_3_section" (utf8mb4) отличается от кодировки базы (utf8mb3)
Кодировка поля "UF_SETTING_DATE" таблицы "b_uts_iblock_3_section" (utf8mb4) отличается от кодировки базы (utf8mb3)
        

Это связано с тем, что таблицы в вашей базе данных используют кодировку `utf8mb4`, а сама база данных использует кодировку `utf8mb3`. Для корректной работы необходимо привести кодировки таблиц и столбцов в соответствие с кодировкой базы данных.

Сбор данных


Сравним кодировку бд и таблиц

#!/bin/bash

# Параметры подключения к базе данных
HOST="localhost"
DATABASE="dbbitrix"
USER="userbitrix"
PASSWORD="BdAzj8S#35hrsu5c"

# Проверка кодировки базы данных
echo "Кодировка базы данных '$DATABASE':"
mysql -h "$HOST" -u "$USER" -p"$PASSWORD" -N -e "SELECT DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = '$DATABASE';"

# Проверка кодировки всех таблиц в базе данных
echo -e "\nКодировка таблиц в базе '$DATABASE':"
mysql -h "$HOST" -u "$USER" -p"$PASSWORD" -N -e "SELECT TABLE_NAME, TABLE_COLLATION FROM information_schema.TABLES WHERE TABLE_SCHEMA = '$DATABASE' ORDER BY TABLE_NAME;"

echo "Готово!"


Решение:

Для решения проблемы необходимо выполнить несколько команд, которые обновят кодировку всех таблиц в базе данных на `utf8mb4` с сортировкой `utf8mb4_0900_ai_ci`. Для этого можно использовать следующий Bash-скрипт, который автоматизирует процесс изменения кодировок.

Шаг 1: Создание и запуск скрипта

Создайте файл с расширением `.sh` (например, `update_charset.sh`), и вставьте в него следующий код:

#!/bin/bash

DB_NAME="dbbitrix"

# Получаем кодировку базы данных
db_charset=$(mysql -D"$DB_NAME" -Bse "SELECT DEFAULT_CHARACTER_SET_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = '$DB_NAME';")
db_collation=$(mysql -D"$DB_NAME" -Bse "SELECT DEFAULT_COLLATION_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = '$DB_NAME';")

# Получаем список таблиц
tables=$(mysql -D"$DB_NAME" -Bse "SHOW TABLES;")

# Применяем ALTER TABLE для каждой таблицы
for table in $tables; do
    echo "Изменение кодировки таблицы: $table"
    mysql -D"$DB_NAME" -e "ALTER TABLE $table CONVERT TO CHARACTER SET $db_charset COLLATE $db_collation;"
done

        

Шаг 2: Запуск скрипта на сервере

Для выполнения скрипта выполните следующие команды на вашем сервере:

chmod +x update_charset.sh
./update_charset.sh
        

Что делает этот скрипт?

Этот скрипт:

  • Получает список всех таблиц в базе данных;
  • Для каждой таблицы выполняет команду `ALTER TABLE`, чтобы изменить кодировку таблицы и всех ее столбцов на `utf8mb4` с сортировкой `utf8mb4_0900_ai_ci`;
  • После выполнения скрипта, все таблицы будут иметь единую кодировку, соответствующую базе данных.

Результат

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

Примечания:

  • Перед запуском скрипта сделайте резервную копию вашей базы данных.
  • Проверьте, что ваш сервер поддерживает кодировку `utf8mb4`.
  • После изменения кодировки таблиц, возможно, потребуется перезагрузить сервер базы данных или Bitrix.

Оставить комментарий