Когда вы восстанавливаете базу данных из дампа 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, похоже, это не волнует.
Не позволяйте этому жуку испортить ваш новогодний праздник, как он испортил мой в прошлом году.