Я получаю сообщение об ошибке ниже при попытке сделать выбор через хранимую процедуру в MySQL.
Недопустимое сочетание параметров сортировки (latin1_general_cs, IMPLICIT) и (latin1_general_ci, IMPLICIT) для операции '='
Есть идеи, что здесь может пойти не так?
Параметры сортировки таблицы latin1_general_ci
и столбца в предложении where latin1_general_cs
.
Ответы:
Как правило, это вызвано сравнением двух строк несовместимого сопоставления или попыткой выбрать данные другого сопоставления в объединенный столбец.
Предложение
COLLATE
позволяет вам указать параметры сортировки, используемые в запросе.Например, следующий
WHERE
пункт всегда будет содержать сообщение об ошибке, которую вы опубликовали:Ваше решение состоит в том, чтобы указать общее сопоставление для двух столбцов в запросе. Вот пример, который использует
COLLATE
предложение:Другой вариант - использовать
BINARY
оператор:Ваше решение может выглядеть примерно так:
или,
источник
COLLATE latin1_general_ci
которая вызывает еще одну ошибку:COLLATION 'utf8_general_ci' is not valid for CHARACTER SET 'latin1''
- даже если у вас нет столбца с CHARACTER SET 'latin1'! Решением является использование BINARY cast. Смотрите также этот вопросTL; DR
Либо измените параметры сортировки одной (или обеих) строк так, чтобы они совпадали, либо добавьте
COLLATE
предложение к своему выражению.Что это за штука "сопоставление"?
Как описано в разделе Наборы символов и сопоставления в целом :
Дополнительные примеры приведены в разделе « Примеры эффекта сопоставления» .
Хорошо, но как MySQL решает, какое сопоставление использовать для данного выражения?
Как задокументировано в разделе Сборка выражений :
Так что же такое «незаконная смесь сопоставлений»?
«Недопустимое сочетание параметров сортировки» возникает, когда выражение сравнивает две строки различных параметров сортировки, но одинакового принуждения, и правила принуждения не могут помочь разрешить конфликт. Это ситуация, описанная в третьем пункте в приведенной выше цитате.
Конкретная ошибка, приведенная в этом вопросе,
Illegal mix of collations (latin1_general_cs,IMPLICIT) and (latin1_general_ci,IMPLICIT) for operation '='
говорит нам о том, что было проведено сравнение на равенство между двумя не-Unicode-строками с одинаковой принудительностью. Кроме того, это говорит нам о том, что параметры сортировки не были указаны явно в выражении, а скорее подразумевались из источников строк (таких как метаданные столбцов).Это все очень хорошо, но как решить такие ошибки?
Как следует из приведенных выше выдержек из руководства, эту проблему можно решить несколькими способами, два из которых целесообразны и должны быть рекомендованы:
Измените параметры сортировки одной (или обеих) строк, чтобы они соответствовали друг другу, и двусмысленности больше не было.
Как это можно сделать, зависит от того, откуда пришла строка: буквальные выражения принимают параметры сортировки, указанные в
collation_connection
системной переменной; значения из таблиц принимают параметры сортировки, указанные в метаданных их столбцов.Принудительно заставить одну строку не быть принудительной.
Я опустил следующую цитату из приведенного выше:
Таким образом, простое добавление
COLLATE
предложения к одной из строк, используемых в сравнении, заставит использовать это сопоставление.В то время как другие были бы ужасно плохой практикой, если бы они были развернуты просто для устранения этой ошибки:
Заставьте одну (или обе) строки иметь какое-либо другое значение принудительности, чтобы иметь приоритет.
Использование
CONCAT()
илиCONCAT_WS()
приведет к получению строки с принудительным значением 1; и (если в хранимой подпрограмме) использование параметров / локальных переменных приведет к появлению строк с принудительным значением 2.Измените кодировки одной (или обеих) строк, чтобы одна была Unicode, а другая - нет.
Это можно сделать с помощью транскодирования с помощью ; или путем изменения базового набора символов данных (например, изменение столбца, изменение литеральных значений или отправка их от клиента в другой кодировке и изменение / добавление средства ввода набора символов). Обратите внимание, что изменение кодировки приведет к другим проблемам, если некоторые новые символы не могут быть закодированы в новом наборе символов.
CONVERT(expr USING transcoding_name)
character_set_connection
character_set_client
Измените кодировки одной (или обеих) строк так, чтобы они были одинаковыми, и измените одну строку для использования соответствующего
_bin
сопоставления.Методы изменения кодировок и параметров сортировки были подробно описаны выше. Этот подход будет бесполезен, если на самом деле нужно применять более сложные правила сопоставления, чем те, которые предлагаются
_bin
сопоставлением.источник
Добавляю свой 2с к обсуждению для будущих гуглеров.
Я исследовал похожую проблему, в которой я получил следующую ошибку при использовании пользовательских функций, которые получили параметр varchar:
Используя следующий запрос:
Я был в состоянии сказать, что БД использовала utf8_general_ci , в то время как таблицы были определены с использованием utf8_unicode_ci :
Обратите внимание, что представления имеют NULL- сортировку. Похоже, что представления и функции имеют определения параметров сортировки, даже если этот запрос показывает нулевое значение для одного представления. Используемая сортировка - это сортировка БД, которая была определена при создании представления / функции.
Печальным решением было изменить сортировку БД и воссоздать представления / функции, чтобы заставить их использовать текущую сортировку.
Изменение сортировки БД:
Изменение таблицы сортировки:
Надеюсь, это кому-нибудь поможет.
источник
show full columns from my_table;
alter table <TABLE> modify column <COL> varchar(255) collate utf8_general_ci;
SHOW session variables like '%collation%';
говорит вам, что »collation_connection« есть »utf8mb4_general_ci«? Тогда бегиSET collation_connection = utf8mb4_unicode_ci
заранее.Иногда преобразование кодировок может быть опасным, особенно в базах данных с огромными объемами данных. Я думаю, что лучший вариант - использовать «бинарный» оператор:
источник
У меня была похожая проблема, я пытался использовать процедуру FIND_IN_SET со строковой переменной .
и получал ошибку
Короткий ответ:
Нет необходимости изменять какие-либо переменные collation_YYYY, просто добавьте правильное сопоставление рядом с объявлением переменной , т.е.
Длинный ответ:
Сначала я проверил параметры сортировки:
Затем я проверил таблицу сортировки:
Это означает, что моя переменная была настроена с параметрами сортировки по умолчанию utf8_general_ci, а моя таблица была настроена как utf8_unicode_ci .
Добавив команду COLLATE рядом с объявлением переменной, переменная сопоставления совпала с сопоставлением, настроенным для таблицы.
источник
Вы можете попробовать этот скрипт , который преобразует все ваши базы данных и таблицы в utf8.
источник
Решение, если задействованы литералы.
Я использую интеграцию данных Pentaho и не могу указать синтаксис SQL. Использование очень простого поиска в БД дало ошибку «Неверное сочетание параметров сортировки (cp850_general_ci, COERCIBLE) и (latin1_swedish_ci, COERCIBLE) для операции« = »»
Сгенерированный код был «ВЫБЕРИТЕ DATA_DATE AS latest_DATA_DATE FROM hr_cc_normalised_data_date_v WHERE PSEUDO_KEY =?»
Короче говоря, поиск был вид, и когда я выпустил
который объясняет, откуда берется cp850_general_ci.
Представление было просто создано с помощью «SELECT» X », ......« В соответствии с подобными инструкциями литералы должны наследовать свой набор символов и параметры сортировки от настроек сервера, которые были правильно определены как «latin1» и «latin1_general_cs», как это явно не случилось я заставил это при создании представления
теперь он показывает latin1_general_cs для обоих столбцов, и ошибка исчезла. :)
источник
MySQL действительно не любит смешивать параметры сортировки, если только он не может привести их к одному и тому же (что в вашем случае явно невозможно). Разве вы не можете принудительно использовать одно и то же сопоставление с помощью предложения COLLATE ? (или более простой
BINARY
ярлык, если применимо ...).источник
Если столбцы, с которыми у вас возникли проблемы, являются "хешами", рассмотрите следующее ...
Если «хеш» является двоичной строкой, вам действительно следует использовать
BINARY(...)
тип данных.Если «хеш» является шестнадцатеричной строкой, вам не нужен utf8, и вам следует избегать этого из-за проверок символов и т. Д. Например, MySQL
MD5(...)
выдает 32-байтовую шестнадцатеричную строку фиксированной длины.SHA1(...)
дает 40-байтовую шестнадцатеричную строку. Это может быть сохранено вCHAR(32) CHARACTER SET ascii
(или 40 для sha1).Или, еще лучше, хранить
UNHEX(MD5(...))
вBINARY(16)
. Это сокращает вдвое размер столбца. (Это, однако, делает его довольно непечатным.)SELECT HEX(hash) ...
Если вы хотите, чтобы он читался.Сравнение двух
BINARY
столбцов не имеет проблем с сопоставлением.источник
Очень интересно ... Теперь будьте готовы. Я посмотрел на все решения "add collate", и для меня это исправления бинтов. Реальность такова, что дизайн базы данных был «плохим». Да, стандартные изменения и новые вещи добавляются, бла-бла, но это не меняет факт проектирования плохой базы данных. Я отказываюсь идти по пути добавления «сортировки» по всем операторам SQL, чтобы заставить мой запрос работать. Единственное решение, которое работает для меня и фактически устранит необходимость подправлять мой код в будущем, - это изменить дизайн базы данных / таблиц в соответствии с набором символов, с которым я буду жить и в будущем. В этом случае я выбираю набор символов « utf8mb4 ».
Таким образом, решение, когда вы сталкиваетесь с этим «недопустимым» сообщением об ошибке, состоит в том, чтобы изменить дизайн базы данных и таблиц. Это намного проще и быстрее, чем кажется. Экспорт ваших данных и повторный импорт из CSV может даже не потребоваться. Измените набор символов базы данных и убедитесь, что все наборы символов ваших таблиц совпадают.
Используйте эти команды, чтобы направлять вас:
Теперь, если вам нравится добавлять «сортировать» здесь и там и дополнять свой код с помощью «переопределений» полных сил, то я думаю.
источник
Возможным решением является преобразование всей базы данных в UTF8 (см. Также этот вопрос ).
источник
Еще одним источником проблемы с сопоставлениями является
mysql.proc
таблица. Проверьте подборки ваших процедур хранения и функций:Также обратите внимание
mysql.proc.collation_connection
и наmysql.proc.character_set_client
колонки.источник
Если у вас есть PHPMYADMIN установлен, вы можете следовать инструкциям , приведенным в следующей ссылке: https://mediatemple.net/community/products/dv/204403914/default-mysql-character-set-and-collation Вы должны соответствовать Сливать базы данных с этим из всех таблиц, а также полей таблиц, а затем перекомпилировать все хранимые процедуры и функции. С этим все должно работать снова.
источник
Я использовал
ALTER DATABASE mydb DEFAULT COLLATE utf8_unicode_ci;
, но не работал.В этом запросе:
Эта работа для меня:
Да, только
concat
.источник
Этот код должен быть помещен внутри Запустить SQL запрос / запросы к базе данных
SQL QUERY WINDOW
Пожалуйста, замените table_name и column_name на соответствующее имя.
источник