- Как перейти с utf8 на utf8mb4 в MySQL
- utf8mb4_general_ci или utf8mb4_unicode_ci
- Настройка кодировки utf8mb4 для СУБД MySQL
- Кодировка и сравнение для базы данных, таблиц и столбцов в MySQL
- Восстановление и оптимизация всех таблиц
- Пример миграции для Yii2
- Включаем поддержку UTF8MB4 в Drupal 7
- UPD
- Изменение кодировки таблиц. Решение для кодеров
- Другие посты
- DB API
- Изменение кодировки таблиц. Решение для кодеров
- Как изменить союз условий в существующем запросе
- Вставка/обновление записи в базу
- Drupal 7
- Изменение кодировки таблиц. Решение для кодеров
- Broken/missing handler
- Длина Друпала в попугаях
- Длина попугая Кеши
Как перейти с utf8 на utf8mb4 в MySQL
Если ваша версия СУБД MySQL 5.5.3 и выше, то вам необходимо использовать кодировку utf8mb4, вместо utf8. Об этом упоминается здесь и здесь.
Следовательно, больше нет необходимости использовать ни utf8_general_ci, ни utf8_unicode_ci.
utf8mb4_general_ci или utf8mb4_unicode_ci
В настоящее время для баз данных и таблиц MySQL рекомендуется использовать кодировку utf8mb4_unicode_ci.
Настройка кодировки utf8mb4 для СУБД MySQL
Исходя из вышеизложенного нам необходимо произвести настройку основных параметров кодировки СУБД MySQL.
В конфигурационном файле MySQL ( my.ini (windows)/ my.cnf (Linux)) необходимо изменить кодировку на utf8mb4:
[client] default-character-set = utf8mb4 [mysql] default-character-set = utf8mb4 [mysqld] character-set-client-handshake = FALSE init_connect ='SET collation_connection = utf8mb4_unicode_ci' init_connect ='SET NAMES utf8mb4' character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci
Проверяем корректность работы применимых настроек:
SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';
+--------------------------+--------------------+ | Variable_name | Value | +--------------------------+--------------------+ | character_set_client | utf8mb4 | | character_set_connection | utf8mb4 | | character_set_database | utf8mb4 | | character_set_filesystem | binary | | character_set_results | utf8mb4 | | character_set_server | utf8mb4 | | character_set_system | utf8 | | collation_connection | utf8mb4_general_ci | | collation_database | utf8mb4_unicode_ci | | collation_server | utf8mb4_unicode_ci | +--------------------------+--------------------+ 10 rows in set, 1 warning (0.00 sec)
Кодировка и сравнение для базы данных, таблиц и столбцов в MySQL
Запросы для измениния кодировки и сравнения для базы данных, таблиц и столбцов на utf8mb4 .
Для базы данных:
ALTER DATABASE [db_name] CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
Для таблицы:
ALTER TABLE [table_name] CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Для столбцов:
ALTER TABLE [table_name] CHANGE [column_name] [column_name] VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Восстановление и оптимизация всех таблиц
После обновления версии MySQL сервера и применения действий по смене кодировки и сравнений, необходимо произвести восстановление и оптимизацию всех баз данных и таблиц. Для этого вы можете выполнить следующие запросы для каждой таблицы:
REPAIR TABLE [table_name]; OPTIMIZE TABLE [table_name];
Или с использованием команды mysqlcheck :
$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
Пример миграции для Yii2
В этом примере мы изменим кодировку для столбца content в таблице post :
/** * @return void * @throws \yii\db\Exception */ public function safeUp() < $sql = "ALTER TABLE `post` CHANGE `content` `content` MEDIUMTEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci"; Yii::$app->db->createCommand($sql)->execute(); > /** * @return void * @throws \yii\db\Exception */ public function safeDown() < $sql = "ALTER TABLE `post` CHANGE `content` `content` MEDIUMTEXT CHARACTER SET utf8 COLLATE utf8_unicode_ci"; Yii::$app->db->createCommand($sql)->execute(); >
Включаем поддержку UTF8MB4 в Drupal 7
Drupal 7 с версии 7.50, научился поддерживать UTF8MB4, но по умолчанию оно не работает. Вообще конечно, это лишь видно в отчёт о состоянии и оно как бы не обязательно, но лично меня раздражает вот это сообщение:
Чтоб от этого избавиться применим магию и заклинаяни. Для начала надо установить сам конвертер.
drush dl utf8mb4_convert drush cc drush
Конвертер установлен, его не нужно устанавливать на каждый сайт, он ставится лишь один раз и устанавливается как команда драш. Теперь пора применить магию и заклинания к каждому конкретному сайту. Погнали
- Делаем бэкап базы данных drush sql-dump >> backup.sql
- Включаем режим обслуживания drush vset maintenance_mode 1
- Конвертируем нашу базу drush utf8mb4-convert-databases
- Включаем поддержку utf8mb4 в settings.php
$databases['default']['default'] = array( 'driver' => 'mysql', 'database' => 'databasename', 'username' => 'username', 'password' => 'password', 'host' => 'localhost', 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_general_ci', );
Все! Магия и заклинания теперь вступили в силу и работают. Запускаем, крон и смотрим отчет о состоянии на нашем сайте, он должен выглядеть так:
UPD
В комментариях товарищ bassay подсказывает, что нужно бы еще и конфиг MySQL поправить:
[mysqld] innodb_large_prefix=true innodb_file_format=barracuda innodb_file_per_table=true
Чуть не забыл. Вы можете почитать меня в твиттере или телеграме, посмотреть мои фотографии в инстаграме, подружиться со мной в PSN, позлить меня на твиче пока я играю или посмотреть в записи. А самые лучшие человеки могут меня поддержать деньгой.
Изменение кодировки таблиц. Решение для кодеров
После установки Drupal версии 7, на странице статуса можно встретить надпись
Database 4 byte UTF-8 support
Enabled, but database tables need conversion
Please convert all database tables to utf8mb4 prior to enabling it in settings.php. See the documentation on adding 4 byte UTF-8 support for more information.
Здесь, как известно, речь идёт о том, что неплохо было бы вам сменить кодировку своей базы таким образом, чтобы она могла корректно сохранять эмоджи, китайские иероглифы, математические и другие спец. символы.
Перейдя по ссылке, можно увидеть действия. необходимые для подготовки базы и сайта к изменению кодировки, а именно:
- Удостовериться, что в конфигах Mysql есть записи
[mysqld] innodb_large_prefix=true innodb_file_format=barracuda innodb_file_per_table=true
Если всё в порядке, тогда можно подготовить сайт. Для этого нужно в вашем settings.php, в массиве настроек коннекции к базе, добавить ключи collation и charset. Результат должен выглядеть примерно так:
$databases['default']['default'] = array( 'driver' => 'mysql', 'database' => 'databasename', 'username' => 'username', 'password' => 'password', 'host' => 'localhost', 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_general_ci', );
Уже после завершения этого этапа на странице статуса сайта можно увидеть примерно следующую картину:
На этом прелюдия заканчивается и для активной фазы изменения кодировки базы и таблиц начинаются переводы стрелок:
- У нас есть возможность нажать на каждую из ссылок на скриншоте выше, по которой можно будет подтвердить свои намерения о изменении кодировки, кликнув специальную кнопку.
- Нам говорят, поставьте модуль, который добавит drush команду, которая позволит изменить кодировку.
- Нашлись добрые люди, которые написали модуль и обернули это дело в функцию. Но сам модуль тоже ничего не делает.
Мне всё это не нравится, т.к. реально вся эта тема укладывается в 4 строчки.
db_query("ALTER DATABASE my_db CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci"); foreach (db_query('show tables')->fetchCol() as $table) db_query("ALTER TABLE $table CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci"); >
Но конечно же, я добавил вкусности и няшности, для удобства и безопасности выполнения процедуры. Создаём свой hook_update_N и запускаем
/** * Implements hook_update_n(). */ function MYMODULE_update_N() $connection = Database::getConnection(); $database_info = $connection->getConnectionOptions(); $database = @$database_info['database'] ?: NULL; $collation = @$database_info['collation'] ?: NULL; $charset = @$database_info['charset'] ?: NULL; if (!$collation) throw new Exception('Collation is not configured'); > if (!$charset) throw new Exception('Charset is not configured'); > if ($database && $collation && $charset) db_query("ALTER DATABASE $database CHARACTER SET = $charset COLLATE = $collation"); foreach (db_query('show tables')->fetchCol() as $table) db_query("ALTER TABLE $table CONVERT TO CHARACTER SET $charset COLLATE $collation"); > // Эта проверка необходима, для того, чтобы убрать сообщение // о некоректной кодировке со страницы статуса т.к. Drupal // делает такую проверку единажды, при установке сайта. if ($connection->utf8mb4IsConfigurable() && $connection->utf8mb4IsActive()) variable_set('drupal_all_databases_are_utf8mb4', TRUE); > > >
Убедитесь, что на данный момент у вас есть в переменной $databases, находящейся в settings.php записи о charset и collation, о чем написано выше.
P.S.
Если будут отзывы о необходимости создания модуля, который делает это не выходя за рамки UI, накидаю такой в следующий раз.
Другие посты
DB API
Изменение кодировки таблиц. Решение для кодеров
Опубликовал Максим Баев, 08 декабря 2017, 14:07
После установки Drupal версии 7, на странице статуса можно встретить надпись
Database 4 byte UTF-8 support
Enabled, but database tables need conversion
Please convert all database tables to utf8mb4 prior to enabling it in settings.php. See the documentation on adding 4 byte UTF-8 support for more information.
Как изменить союз условий в существующем запросе
Опубликовал Максим Баев, 30 сентября 2016, 12:15
Предположим, вам необходимо выбрать все опубликованные ноды и автор которых — суперадмин. В SQL запрос должен выглядеть так:
SELECT n.* FROM node n WHERE (n.status = 1 AND n.uid = 1)
Сформировать такой запрос не составит труда.
$query = db_select('node', 'n') ->fields('n') ->condition('n.status'.
Вставка/обновление записи в базу
Опубликовал Максим Баев, 23 ноября 2013, 11:36
В Drupal 7 есть Api для работы с базой, но есть и другие функции упрощающие эту работу. Например, drupal_write_record().
$table = 'my_table'; $values = (object) array( 'field1' => 'value1', 'field2' => 'value2', ); drupal_write_record($table, $values);
или, если нужно обновить строку, а не.
Drupal 7
Иногда программисты сталкиваются с необходимостью создать инстанцию CKEditor редактора на фронте. Например, если этот редактор должен появляться по нажатию на кнопку. Обычно это делается через получение формы с сервера:
/** * Form builder for editor. */ function mymodule_editor_form($form, &$form_state) $form['editor'].
Изменение кодировки таблиц. Решение для кодеров
Опубликовал Максим Баев, 08 декабря 2017, 14:07
После установки Drupal версии 7, на странице статуса можно встретить надпись
Database 4 byte UTF-8 support
Enabled, but database tables need conversion
Please convert all database tables to utf8mb4 prior to enabling it in settings.php. See the documentation on adding 4 byte UTF-8 support for more information.
Broken/missing handler
Опубликовал Максим Баев, 13 июня 2017, 16:22
Если вы создали field/sort/filter/area или что-то еще для views в своём модуле blablabla и видите надпись:
То одной из возможных причин может быть отсутствие строки подключения вашего класса в blablabla.info
files[] = includes/views/handlers/blablabla_handler_my_handler.inc
Длина Друпала в попугаях
Опубликовал Максим Баев, 25 ноября 2016, 21:13
Это пост, в котором не будет описания установки модуля, программного создания ноды или того, как избавиться от ошибок. Только попугаи!
Длина попугая Кеши
Вот взбрела же дурацкая мысль посчитать Друпал в попугаях. Нормальные люди считают в байтах, в деньгах или, на крайний случай, в человеко-часах. Но я не ищу лёгких путей! Как же.