Кодировка и соединение БД битрикс в utf8mb4?

Ссылка скопирована
1 ответ

Подскажите, правильно ли я сдлелал.
Суть: База данных кочевала по серверам, по-видимому, имевших различие в настройках character и collation сервера mysql. В БД существуют, как utf8, так и utf8mb4, utf8_general_ci, utf8_unicode_ci, utf8mb4_general_ci, utf8mb4_unicode_ci.

Выполнение "Проверки системы" в административном разделе 1с-битрикса постоянно ругалось, на это всё. Автоматически исправишь, опять запускаешь проверку, еще что-то вылезает, лезешь делать смену потаблично. Опять проверяешь, опять что-то не нравится.

Решил поступить, возможно, слишком "влоб".
Учитывая, что хотелось бы всё иметь в utf8mb4 и ut8fmb4_unicode_ci (современно, с эмодзи и всё такое, битрикс кстати обновлен тоже до последней версии), открыл дамп бд в vim-е, заменил всё на вышеуказанные кодировку и сравненние.
Подсунул этот дамп битриксу. Запустил проверку, она ругнулась, что кодировка отличается utf8 <---> utf8mb4.
Посмотрел в настройки двух файлов php_interface/after_connect{_d7}.php:
Там:

$this-&gt;queryExecute("SET NAMES 'utf8'");                                                                                                                                                     $this-&gt;queryExecute('SET collation_connection = "utf8_unicode_ci"');

$this-&gt;queryExecute("SET NAMES 'utf8'"); $this-&gt;queryExecute('SET collation_connection = "utf8_unicode_ci"');

Заменила на:

$this-&gt;queryExecute("SET NAMES 'utf8mb4'");                                                                                                                                                     $this-&gt;queryExecute('SET collation_connection = "utf8mb4_unicode_ci"');

$this-&gt;queryExecute("SET NAMES 'utf8mb4'"); $this-&gt;queryExecute('SET collation_connection = "utf8mb4_unicode_ci"');

Теперь "Проверка системы" выполнятеся без ошибок.
Вопрос, чреват ли чем-то такой метод? Не костыли ли это?

Дополнительно:

Если навскидку прикинуть, что пространство символов utf8mb4_unicode_ci шире и оно вмещает все пространство utf8_unicode_ci, то перевод utf8_unicode_ci на utf8mb4_unicode_ci должен пройти безболезненно.
Возможны косяки, если вы переводите кодировку из широкого в узкое пространство, там выпадут из дампа символы, которые находились в более широкой части регистра пространства, чем позволяет конечная кодировка (как раз эмодзи могут пострадать), но это не ваш случай.

  • чреват ли чем-то такой метод?

    В общем случае да.

    Есть одна мелочь в определении collation, на которую обычно не обращают внимания - это space padding. Некоторые collation учитывают хвостовые пробелы при сравнении, некоторые нет. Если эта характеристика не изменяется - то гарантированно всё ровненько. Иначе - надо проверять и убеждаться, что учёт хвостовых пробелов не влияет на поведение программного обеспечения.

    См. Trailing Space Handling in Comparisons.

    В данном же конкретном случае проблем не будет - и у utf8mb3_unicode_ci, и у utf8mb4_unicode_ci значение Pad_attribute одинаково и равно PAD SPACE. Т.е. сделанная замена никак не изменяет поведения.

  • Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Дмитрий К. Ответ

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

    1. Настройка кодировки в базе данных:
    - Убедитесь, что ваша база данных MySQL поддерживает кодировку utf8mb4. Для этого выполните следующий запрос:

       SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';

    SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';

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

       ALTER DATABASE имя_базы_данных CHARACTER SET utf8mb4;

    ALTER DATABASE имя_базы_данных CHARACTER SET utf8mb4;

    2. Настройка соединения с базой данных в Битрикс:
    - Откройте файл /bitrix/php_interface/dbconn.php на вашем сервере.
    - Найдите и отредактируйте следующие строки, добавив указание на кодировку utf8mb4:

       define("BX_UTF", true);
       define("DBPersistent", false);
       $DBType = "mysql";
       $DBHost = "localhost";
       $DBLogin = "ваш_логин";
       $DBPassword = "ваш_пароль";
       $DBName = "ваша_база_данных";
       $DBDebug = false;
       $DBDebugToFile = false;
       $DBHost = "mysql:host=localhost;dbname=имя_базы_данных;charset=utf8mb4";

    define("BX_UTF", true); define("DBPersistent", false); $DBType = "mysql"; $DBHost = "localhost"; $DBLogin = "ваш_логин"; $DBPassword = "ваш_пароль"; $DBName = "ваша_база_данных"; $DBDebug = false; $DBDebugToFile = false; $DBHost = "mysql:host=localhost;dbname=имя_базы_данных;charset=utf8mb4";

    - После внесения изменений сохраните файл и перезагрузите сайт.

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

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно