Основное различие между utf8mb3 и utf8mb4 заключается в поддержке различных диапазонов символов и их кодировке.
-
Диапазон символов:
utf8mb3: Поддерживает только символы из базовой многоязычной плоскости (BMP, Basic Multilingual Plane), которая включает символы, закодированные в пределах 1-3 байт. Это охватывает большинство распространённых символов, включая латиницу, кириллицу, китайские иероглифы и другие.
utf8mb4: Поддерживает все символы из BMP, а также символы из дополнительных плоскостей (например, эмодзи, редкие иероглифы, символы древних письменностей). Эти символы могут занимать до 4 байт.
-
Эмодзи и специальные символы:
utf8mb3: Не поддерживает эмодзи и другие символы, которые требуют 4 байта для кодирования.
utf8mb4: Полностью поддерживает эмодзи и другие символы, требующие 4 байта.
-
Совместимость:
utf8mb3: Является устаревшей версией и считается ограниченной. В современных приложениях рекомендуется использовать utf8mb4.
utf8mb4: Является расширенной и современной версией, которая полностью совместима с utf8mb3 для символов, которые кодируются в 1-3 байта.
-
Хранение данных:
utf8mb3: Использует меньше места для хранения, так как не поддерживает 4-байтовые символы.
utf8mb4: Может занимать больше места для хранения, если используются 4-байтовые символы.
-
Рекомендации:
В современных приложениях рекомендуется использовать utf8mb4, так как он поддерживает больше символов и является более универсальным.
Если вам нужно хранить эмодзи или другие специальные символы, utf8mb4 — это единственный вариант.
Пример:
Если вы хотите хранить текст с эмодзи (например, 😊), то вам нужно использовать utf8mb4.
Если вы работаете только с текстом, который не содержит эмодзи или редких символов, utf8mb3 может быть достаточным, но всё равно рекомендуется использовать utf8mb4 для будущей совместимости.
Конвертация данных:
Зайдите в административную панель вашего сайта и перейдите в раздел Рабочий стол -> Настройки -> Инструменты -> Командная PHP-строка
Далее нужно выполнить PHP код, который подготовит SQL скрипт для конвертации базы в utf8mb4
$conn = \Bitrix\Main\Application::getConnection();
$helper = $conn->getSqlHelper();
$sql = "ALTER DATABASE `{$helper->forSql($conn->getDatabase())}` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;\n";
$i = $conn->query('SHOW TABLES');
while ($row = $i->fetch()) {
$table = reset($row);
$sql .= "ALTER TABLE `{$helper->forSql($table)}` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;\n";
}
echo $sql;
на выходе мы получим готовый SQL скрипт, примерно такого содержания
ALTER TABLE `b_abtest` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `b_admin_notify` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `b_admin_notify_lang` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `b_adv_banner` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `b_adv_banner_2_country` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `b_adv_banner_2_day` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `b_adv_banner_2_group` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `b_adv_banner_2_page` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `b_adv_banner_2_site` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `b_adv_banner_2_stat_adv` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `b_adv_banner_2_weekday` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `b_adv_contract` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `b_adv_contract_2_page` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `b_adv_contract_2_site` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `b_adv_contract_2_type` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `b_adv_contract_2_user` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `b_adv_contract_2_weekday` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `b_adv_type` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `b_agent` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `b_app_password` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `b_b24connector_button_site` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `b_b24connector_buttons` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Затем перейти Рабочий стол -> Настройки -> Инструменты -> SQL запрос
и выполнить полученный скрипт.
После конвертации нужно изменить настройки подключения к базе, в файле /bitrix/php_interface/after_connect_d7.php для SET NAMES и SET collation_connection
$this->queryExecute("SET NAMES 'utf8mb4'");
$this->queryExecute('SET collation_connection = "utf8mb4_unicode_ci"');
Обратите внимание:
Что для конвертации таблиц используется ALTER TABLE ... CONVERT TO CHARACTER SET ...
, который в качестве стороннего эффекта увеличивает допустимую размерность некоторых символьных полей. Проверка сайта покажет несоответствие структуры базы данных и определений таблиц, как они заданы в модулях. Это несоответствие не является критическим для работы сайта и может быть исправлено выполнением ALTER TABLE ... CHANGE COLUMN
, полученными из журнала проверки сайта.
Заключение:
utf8mb4 — это более современная и расширенная версия, которая рекомендуется для использования в большинстве случаев. utf8mb3 считается устаревшим и ограниченным.