Кодировка и соединение БД битрикс в utf8mb4?
Подскажите, правильно ли я сдлелал.
Суть: База данных кочевала по серверам, по-видимому, имевших различие в настройках 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->queryExecute("SET NAMES 'utf8'"); $this->queryExecute('SET collation_connection = "utf8_unicode_ci"'); |
$this->queryExecute("SET NAMES 'utf8'"); $this->queryExecute('SET collation_connection = "utf8_unicode_ci"');
Заменила на:
$this->queryExecute("SET NAMES 'utf8mb4'"); $this->queryExecute('SET collation_connection = "utf8mb4_unicode_ci"'); |
$this->queryExecute("SET NAMES 'utf8mb4'"); $this->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. Т.е. сделанная замена никак не изменяет поведения.
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для того чтобы установить кодировку и соединение с базой данных Битрикс в utf8mb4, вам потребуется выполнить несколько шагов.
1. Настройка кодировки в базе данных:
- Убедитесь, что ваша база данных MySQL поддерживает кодировку utf8mb4. Для этого выполните следующий запрос:
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";
- После внесения изменений сохраните файл и перезагрузите сайт.
Теперь ваше соединение с базой данных в Битрикс должно быть установлено с кодировкой utf8mb4. Не забудьте также проверить, что все таблицы в вашей базе данных также используют эту кодировку.