Улучшит ли производительность базы данных переход на кодировку utf8mb4 и удаление соответствующих директив из файла after_connect_d7.php?

В настройках mariadb-server указаны следующие параметры: <br/> <pre><code>character-set-server  = utf8
collation-server      = utf8_unicode_ci</code></pre> <br/> Таким образом, база данных использует utf8mb3. <br/> <br/> В файле bitrix/php_interface/after_connect_d7.php содержатся следующие команды: <br/> <pre><code class="php">$this-&gt;queryExecute("SET NAMES 'utf8mb4'");
$this-&gt;queryExecute("SET collation_connection = 'utf8mb4_unicode_ci'");</code></pre> <br/> <br/> Правильно ли будет изменить настройки базы данных на: <br/> <pre><code>character-set-server  = utf8mb4
collation-server      = utf8mb4_unicode_ci</code></pre> <br/> <br/> и удалить соответствующие строки из файла after_connect_d7.php? <br/> <br/> Также, верно ли утверждение, что "конвертация" кодировки "на лету" с использованием PHP значительно увеличивает нагрузку на процессор? <br/> <br/> (при этом предполагается, что возможные проблемы с базой данных и отображением на сайте не рассматриваются).
  • 4 декабря 2024 г. 19:23
Ответы на вопрос 2
Переход на кодировку `utf8mb4` и установка соответствующих настроек базы данных, безусловно, лучше с точки зрения поддержки всех доступных Unicode символов, включая эмодзи и некоторые специальные символы, которые не поддерживаются в `utf8mb3` (который фактически является `utf8` в MySQL/MariaDB). 

### Изменение настроек базы данных

Если вы измените настройки базы данных на:
```ini
character-set-server  = utf8mb4
collation-server      = utf8mb4_unicode_ci
```
Это устанавливает кодировку для вашей базы данных и всех новых подключений по умолчанию в `utf8mb4`, что приведет к лучшей поддержке символов. В этом случае строки в вашем коде, которые выполняют `SET NAMES 'utf8mb4'` и `SET collation_connection = 'utf8mb4_unicode_ci'`, становятся излишними, и вы можете их удалить.

### Влияние на производительность

Что касается производительности, то переключение кодировки может уменьшить нагрузку на процессор. Когда вы выполняете `SET NAMES`, это может привести к некоторым затратам производительности на каждый запрос, поскольку сервер должен конвертировать данные из одной кодировки в другую. Если установлены правильные настройки на уровне сервера, дополнительных преобразований не потребуется, так как данные уже будут храниться и передаваться в нужной кодировке.

### О нагрузке на CPU

Да, "конвертация" кодировки "на лету" с использованием PHP может значительно увеличить нагрузку на процессор, особенно если соединения и запросы обрабатываются в большом объеме. Если все подключения к базе данных и записи уже адаптированы к `utf8mb4`, то ваш сервер базы данных сможет сосредоточиться на выполнении запросов, а не на конвертации кодировок.

### Заключение

В общем, правильное изменение настроек базы данных на `utf8mb4` и удаление соответствующих строк из PHP-скрипта стоит сделать, если вы хотите избежать лишних преобразований и улучшить поддержку символов Unicode, что в свою очередь может также улучшить производительность вашей базы данных. Однако всегда стоит заранее провести тестирование, особенно если ваше приложение уже использует кодировку `utf8mb3`.
Нет, неверно. 

character-set-server и collation-server вообще ни на что не влияют. А только задают умолчания, если при создании БД и таблиц ленивый программист не указал кодировку. Поэтому трогать их нет смысла вообще.

Добавлять utf8mb4 в соединение также бессмысленно, если сами данные в utf8. Недостающие расширенные символы база не родит.
И наоборот - если таблицы в utf8mb4, то указывать её при соединении надо в обязательном порядке. Не потому что вдруг "конвертация на лету" а потому что если соединение будет utf8, то расширенные символы клиент не получит.

(В теории, всё может работать нормально и без установки utf8mb4 для соединения, поскольку она в пыхе в какой-то момент начала использоваться по умолчанию, но лучше всё-таки задавать явно)
Похожие вопросы