Please convert all database tables to utf8mb4 prior to enabling it in settings php

Как перейти с 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 .

Читайте также:  Sign Up

Для базы данных:

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

/vkliuchaiem-poddierzhku-utf8mb4-v-drupal-7/featured-image.png

Drupal 7 с версии 7.50, научился поддерживать UTF8MB4, но по умолчанию оно не работает. Вообще конечно, это лишь видно в отчёт о состоянии и оно как бы не обязательно, но лично меня раздражает вот это сообщение:

Чтоб от этого избавиться применим магию и заклинаяни. Для начала надо установить сам конвертер.

drush dl utf8mb4_convert drush cc drush 

Конвертер установлен, его не нужно устанавливать на каждый сайт, он ставится лишь один раз и устанавливается как команда драш. Теперь пора применить магию и заклинания к каждому конкретному сайту. Погнали

  1. Делаем бэкап базы данных drush sql-dump >> backup.sql
  2. Включаем режим обслуживания drush vset maintenance_mode 1
  3. Конвертируем нашу базу drush utf8mb4-convert-databases
  4. Включаем поддержку 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, позлить меня на твиче пока я играю или посмотреть в записи. А самые лучшие человеки могут меня поддержать деньгой.

Источник

Изменение кодировки таблиц. Решение для кодеров

image

После установки 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', ); 

drupal-db-collation

Уже после завершения этого этапа на странице статуса сайта можно увидеть примерно следующую картину:

На этом прелюдия заканчивается и для активной фазы изменения кодировки базы и таблиц начинаются переводы стрелок:

  1. У нас есть возможность нажать на каждую из ссылок на скриншоте выше, по которой можно будет подтвердить свои намерения о изменении кодировки, кликнув специальную кнопку.
  2. Нам говорят, поставьте модуль, который добавит drush команду, которая позволит изменить кодировку.
  3. Нашлись добрые люди, которые написали модуль и обернули это дело в функцию. Но сам модуль тоже ничего не делает.

Мне всё это не нравится, т.к. реально вся эта тема укладывается в 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); > > > 

image

Убедитесь, что на данный момент у вас есть в переменной $databases, находящейся в settings.php записи о charset и collation, о чем написано выше.

P.S.
Если будут отзывы о необходимости создания модуля, который делает это не выходя за рамки UI, накидаю такой в следующий раз.

Другие посты

Источник

DB API

Изменение кодировки таблиц. Решение для кодеров

Опубликовал Максим Баев, 08 декабря 2017, 14:07

image

После установки 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

image

После установки 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

Это пост, в котором не будет описания установки модуля, программного создания ноды или того, как избавиться от ошибок. Только попугаи!

Длина попугая Кеши

Вот взбрела же дурацкая мысль посчитать Друпал в попугаях. Нормальные люди считают в байтах, в деньгах или, на крайний случай, в человеко-часах. Но я не ищу лёгких путей! Как же.

Источник

Оцените статью