Решение найдено, но прошу объяснить

InstantCMS 2.X

Словил ошибку обращения к БД, как избежать в дальнейшем

#1 26 июля 2021 в 00:31

Установил на сборку social от goodmade компонент AMP и Турбо страницы. Компонент установился без ошибок, но в админке никак не отображались добавленные строки источников этих AMP и турбо страниц. Выглядело это дело так.Изображение

При запуске из планировщика задания на создание турбо страниц — словил такую ошибку

Изображение

В общем компонент не работал как нужно, а причина связана с базой данных. Меня смутило то, что эта ошибка выскочила на сборке, а на обычно установленных icms  этот компонент ошибок не выдавал и нормально работал. Пообщавшись с разработчиками сборки и компонента я понял, что ни сборка ни компонент ни при чем. Сравнил сопоставление в базах данных. В сборке во всех таблицах базы данных тип и сопоставление указаны как InnoDB  utf8mb4_general_ci, а на сайтах с обычно установленной icms так: InnoDB  utf8mb4_0900_ai_ci. 

После установки компонента в его таблицах тоже было прописано InnoDB  utf8mb4_0900_ai_ci. Погуглив нашел такое решение в виде нескольких запросов:

  1. ALTER DATABASE your_db CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
  2. ALTER TABLE cms_amp_pages CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
  3. ALTER TABLE cms_turbo_pages CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

И компонент стал нормально работать. Мне просто интересно при обычной установке icms у нас как то автоматом выбирается сопоставление utf8mb4_0900_ai_ci или тут cms тоже ни при чем, а так настроен mysql сервер по умолчанию. Сборка устанавливается залитием файлов и импортом дампа в базу, понятно что уже в дампе все было определено в utf8mb4_general_ci.  Светлые головы кто хорошо разбирается — объясните что к чему. Собственно почему такая ошибка если сопоставления 2 таблиц отличаются от сопоставлений других таблиц базы? По этой ошибке понял что это «Неправильное сочетание сопоставлений». Хочется услышать мнение разбирающегося человека. Спасибо.

#2 26 июля 2021 в 09:51

Наверное какие тип и сопоставление указали при создании бд для установки системы, такие и установились. Если бд создавалась во время установки, то значит установились используемые для бд по умолчанию на сервере. Система тут вообще «не при делах»).

#3 26 июля 2021 в 10:35

 на сайтах с обычно установленной icms так: InnoDB  utf8mb4_0900_ai_ci. 

В процессе обычной установки CMS вы БД создаете заранее или скрипт установки создает ее в ходе установки?

 

#4 26 июля 2021 в 15:56

Я всегда создаю бд заранее перед установкой, просто в PMA вписываю название базы и выбираю utf8mb4_general_ci и нажимаю создать.

Изображение

Сейчас заглянул что там еще у меня в настройках pma 

Изображение

Изображение

Вроде все нормально настроено… откуда оно потом во всех таблицах появляется utf8mb4_0900_ai_ci   я не понимаю...

#5 26 июля 2021 в 16:03

А если запросить

SHOW CHARACTER SET LIKE 'utf8%';

что выводится?

#6 26 июля 2021 в 16:11

Собственно почему такая ошибка если сопоставления 2 таблиц отличаются от сопоставлений других таблиц базы?

Юран

Имхо, в sql дампе установщика дополнения для текстовых полей была указана utf8mb4_0900_ai_ci 🙂

#7 26 июля 2021 в 16:17

откуда оно потом во всех таблицах появляется utf8mb4_0900_ai_ci   я не понимаю...

Юран

Это кодировка по умолчанию в php 8.0. Может оттуда?

#8 26 июля 2021 в 17:05

А если запросить

SHOW CHARACTER SET LIKE 'utf8%';

что выводится?

IamB

Изображение

IamB — как поменять на utf8_geberal_ci и нужно ли? Что станет с уже создаными бд?

Добавлено спустя 1 минуту

Имхо, в sql дампе установщика дополнения для текстовых полей была указана utf8mb4_0900_ai_ci

Fuze

В sql дампе установщика просто utf8 

  1. CREATE TABLE IF NOT EXISTS `cms_turbo_pages` (
  2. `id` INT(11) NOT NULL AUTO_INCREMENT,
  3. `ctype_name` VARCHAR(32) NOT NULL,
  4. `title_field` VARCHAR(40) NOT NULL,
  5. `content_field` VARCHAR(40) NOT NULL,
  6. `photo_field` VARCHAR(40) DEFAULT NULL,
  7. `analytics` text,
  8. `adNetwork` text,
  9. PRIMARY KEY (`id`)
  10. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
  11.  
  12. CREATE TABLE IF NOT EXISTS `cms_amp_pages` (
  13. `id` INT(11) NOT NULL AUTO_INCREMENT,
  14. `ctype_name` VARCHAR(60) NOT NULL,
  15. `photo_field` VARCHAR(40) DEFAULT NULL,
  16. `ads` text,
  17. PRIMARY KEY (`id`)
  18. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
  19.  
  20. DELETE FROM `cms_scheduler_tasks` WHERE `controller` = 'turboamp';
  21. INSERT INTO `cms_scheduler_tasks` (`title`, `controller`, `hook`, `period`, `date_last_run`, `is_active`, `is_new`) VALUES ('Создание турбо-страниц', 'turboamp', 'turbo', 1440, NULL, 1, 1);
Добавлено спустя 2 минуты

Это кодировка по умолчанию в php 8.0. Может оттуда?

Lora

Нет, у меня PHP — 7.4.3 

#9 26 июля 2021 в 17:10

IamB — как поменять на utf8_geberal_ci и нужно ли? Что станет с уже создаными бд?

Я хотел для начала выяснить пришлое ли значение collation или же оно по-умолчанию. А на ваши вопросы готовых ответов у меня сейчас нет.

 

#10 27 июля 2021 в 13:42

Немного нагуглил информации, скорее всего что то связано с версией mysql сервера. 

Параметры сортировки по умолчанию для utf8mb4 различаются в MySQL 5.7 и 8.0. (utf8mb4_general_ci для 5.7, utf8mb4_0900_ai_ci для 8.0).
Когда клиент 8.0 запрашивает набор символов utf8mb4, что он отправляет для сервера используется сортировка по умолчанию 8.0 utf8mb4; это utf8mb4_0900_ai_ci.
utf8mb4_0900_ai_ci реализован только в MySQL 8.0, поэтому версия 5.7 сервер не распознает его.
Поскольку сервер 5.7 не распознает utf8mb4_0900_ai_ci, он не может удовлетворить запрос набора символов клиента и возвращается к своему набор символов и сопоставление по умолчанию (latin1 и latin1_swedish_ci).
В этом случае клиент все еще может использовать utf8mb4, выполнив инструкцию SET NAMES 'utf8mb4' после подключения. В результате получается сортировка по умолчанию utf8mb4 5.7; то есть utf8mb4_general_ci. Если клиенту дополнительно требуется сопоставление utf8mb4_0900_ai_ci, он не сможет этого добиться, потому что сервер не распознает это сопоставление. Клиент должен либо желать использовать другое сопоставление utf8mb4, либо подключаться к серверу из MySQL 8.0 или выше.

Utf8mb4_0900_ai_ci — это новое сопоставление в MySQL 8.0

Он не распознается в более ранних версиях MySQL, например 5.7.

Он также может не распознаваться в форках MySQL, таких как MariaDB.

Вы должны использовать это сопоставление только в MySQL 8.0.

У меня версия mysql: 8.0.22-0ubuntu0.20.04.3   

Дефолтные значения кодировки utf8mb4 различаются для разных версий сервера. Немного прояснилась эта тема. У себя ничего менять не буду потому как все работает. А если будет ошибка — то наверное проще исправить запросами как в моем примере чем менять по умолчанию для всего сервера.

dev.mysql.com/doc/refman/8.0/en/charset-charsets.html

dev.mysql.com/doc/refman/5.7/en/charset-charsets.html

Пусть этот топик будет здесь, вдруг когда-то пригодится кому:))  Спасибо большое всем кто откликнулся и помог прояснить ситуацию.

 

Добавлено спустя 20 часов

Проблема решена, еще раз всем спасибо.

Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.