Рейтинг:3

#1267 - Недопустимое сочетание сопоставлений (utf8mb4_0900_ai_ci,COERCIBLE) и (latin1_swedish_ci,IMPLICIT) для операции UNION.

флаг gb

Я обновил MySQL с версии 5.7 до 8. Я экспортировал базу данных из старой версии MySQL 5.7 и теперь пытаюсь импортировать базу данных в MySQL 8.Но я получаю сообщение об ошибке для одного из представлений базы данных с предложением союза.

ошибка -

#1267 - Недопустимое сочетание сопоставлений (utf8mb4_0900_ai_ci,COERCIBLE) и (latin1_swedish_ci,IMPLICIT) для операции UNION.

вид -

СОЗДАТЬ ПРОСМОТР VIEW_ALL_ORDER_ITEMS_REF КАК
  выберите * из VIEW_ORDER_ITEM_EQ_REF
  союз 
  выберите * из VIEW_ORDER_ITEM_SO_REF
  союз 
  выберите * из VIEW_ORDER_ITEM_OA_REF
  союз 
  выберите * из VIEW_ORDER_ITEM_WO_REF
  союз 
  выберите * из VIEW_ORDER_ITEM_DO_REF

Я столкнулся с этой ошибкой, когда пытаюсь применить объединение между более чем двумя представлениями.

этот вид работает нормально.

удалить представление, если оно существует VIEW_ALL_ORDER_ITEMS_REF;
СОЗДАТЬ ПРОСМОТР VIEW_ALL_ORDER_ITEMS_REF КАК
  выберите * из VIEW_ORDER_ITEM_EQ_REF
  союз 
  выберите * из VIEW_ORDER_ITEM_SO_REF

кто-нибудь может помочь?

флаг in
Как у вас дела с импортом данных? Восстановление из дампа SQL?
rahul shalgar avatar
флаг gb
да............
Рейтинг:1
флаг in

Когда вы восстанавливаете базу данных из дампа MySQL, вы можете решить свою проблему, а также подготовить базу данных к будущему, изменив набор символов и параметры сортировки для ваших таблиц, функций и процедур. Существует ряд изменений между MySQL 5.7 и 8.x, так что сейчас самое подходящее время для этого.

Вот что вы можете сделать с каждым СОЗДАЙТЕ утверждение:

  1. Заменить ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ к utf8mb4

  2. Заменить СОРТИРОВАТЬ к utf8mb4_unicode_ci

  3. (Для таблиц) Убедитесь, что ДВИГАТЕЛЬ установлен на ИнноБД

    Примечание: Вы больше не хотите использовать 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, похоже, это не волнует.

Не позволяйте этому жуку испортить ваш новогодний праздник, как он испортил мой в прошлом году.

rahul shalgar avatar
флаг gb
это сработало .. большое спасибо @matigo .. есть ли возможность установить кодировку и сопоставление глобально?
флаг in
Вы можете установить параметры сортировки по умолчанию в `my.cnf`, но это может привести к проблемам, если вы выполняете репликацию на нескольких серверах, и один из них не имеет значения сортировки в файле конфигурации. Это крайний случай, но болезненный, если он попадает. Конкретность в объявлениях избавит вас от многих проблем в будущем.
rahul shalgar avatar
флаг gb
ок спасибо бро...
rahul shalgar avatar
флаг gb
У меня нет хранимых процедур и триггеров в моей базе данных.. она содержит только таблицы.. вместо восстановления базы данных из дампа SQL, могу ли я просто изменить все свои таблицы в существующей базе данных, чтобы изменить кодировку и параметры сортировки?
флаг in
Переделать можно, да. Обратите внимание, что впоследствии может появиться искаженный текст, поскольку операторы `ALTER TABLE` и `ALTER COLUMN` не безупречны при перемещении данных между сопоставлениями. Если весь ваш текст стандартен от A до Z и от 0 до 9, все будет в порядке. Если у вас есть какие-либо нелатинские символы, вам захочется тестировать, тестировать и еще раз тестировать. Я работаю с большим количеством азиатских, еврейских и арабских данных и за годы работы сталкивался с многочисленными проблемами, пытаясь «сэкономить время». Повторный импорт после изменения файла `.sql` всегда был самым быстрым для баз данных размером более 1 ГБ.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.