Когда вы восстанавливаете базу данных из дампа MySQL, вы можете решить свою проблему, а также подготовить базу данных к будущему, изменив набор символов и параметры сортировки для ваших таблиц, функций и процедур. Существует ряд изменений между MySQL 5.7 и 8.x, так что сейчас самое подходящее время для этого.
Вот что вы можете сделать с каждым СОЗДАЙТЕ утверждение:
Заменить ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ к utf8mb4
Заменить СОРТИРОВАТЬ к utf8mb4_unicode_ci
(Для таблиц) Убедитесь, что ДВИГАТЕЛЬ установлен на ИнноБД
Примечание: Вы больше не хотите использовать MyISAM или смешивать ДВИГАТЕЛЬ типы с запросами, так как это довольно значительный удар по производительности.
Сделайте все это с помощью предпочитаемого вами текстового редактора, а затем запустите процесс импорта в новую базу данных MySQL. Обязательно установите базу данных ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ и СОРТИРОВАТЬ те же значения, что и для таблиц, функций и процедур.
Обоснование предложений:
MySQL 8.0 — это значительный отход от линейки 5.x с большим количеством элементов, которые считались устаревшими до того, как 5.2 были полностью удалены. Сюда входят определенные типы столбцов, а также параметры сортировки. Процесс импорта попытается автоматически адаптировать устаревшие элементы к их современным эквивалентам, но часто приводит к беспорядку в наборах символов и сопоставлениях.
utf8mb4_unicode_ci оказалась наиболее надежной сортировкой при работе с многобайтовыми символами, такими как смайлики и те, которые используются не на английском языке.Хотя он будет использовать немного больше места на диске, это гарантирует, что ваши приложения смогут обрабатывать любой брошенный им символ. _ci бит в конце гарантирует, что значения обрабатываются как нечувствительные к регистру при объединении и выполнении поиска.
Замена всех СИМВОЛ и СОРТИРОВАТЬ значения гарантируют, что вы не получите Недопустимое сочетание сопоставлений опять ошибка... если только...
Что следует учитывать при работе с хранимыми процедурами и триггерами
MySQL 8.0, кажется, ожидает большей специфичности при создании временных таблиц в хранимых процедурах. Если вы используете временные таблицы, обязательно предварительно определите их в коде так же, как и с обычной таблицей. Синтаксис почти такой же, за исключением того, что вы добавляете дополнительное слово:
УДАЛИТЬ ВРЕМЕННУЮ ТАБЛИЦУ, ЕСЛИ СУЩЕСТВУЕТ `YearlySums`;
СОЗДАЙТЕ ВРЕМЕННУЮ ТАБЛИЦУ, ЕСЛИ НЕ СУЩЕСТВУЕТ `YearlySums` (
...
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
Это гарантирует, что вы не столкнетесь с Недопустимое сочетание сопоставлений ошибка при работе с хранимыми процедурами.
Если в ваших таблицах есть ПЕРЕД ВСТАВКОЙ или же ДО ОБНОВЛЕНИЯ триггеры, а эти таблицы заполняются с помощью хранимых процедур, вам потребуется провести множество тестов, прежде чем помещать базу данных в рабочую настройку. Oracle представила довольно серьезную ошибку в 8.0.25, которая может привести к сбою ядра MySQL Server в определенных случаях, когда ПЕРЕД триггер обрабатывает строки как часть проверки данных, но только тогда, когда эти данные предоставляются хранимой процедурой. Проблема существует уже больше года, и Oracle, похоже, это не волнует.
Не позволяйте этому жуку испортить ваш новогодний праздник, как он испортил мой в прошлом году.