Сообщение об ошибке на MySql:
Illegal mix of collations (utf8_unicode_ci,IMPLICIT) and (utf8_general_ci,IMPLICIT) for operation '='
Я просмотрел несколько других постов и не смог решить эту проблему. Затрагиваемая часть выглядит примерно так:
CREATE TABLE users (
userID INT UNSIGNED NOT NULL AUTO_INCREMENT,
firstName VARCHAR(24) NOT NULL,
lastName VARCHAR(24) NOT NULL,
username VARCHAR(24) NOT NULL,
password VARCHAR(40) NOT NULL,
PRIMARY KEY (userid)
) ENGINE = INNODB CHARACTER SET utf8 COLLATE utf8_unicode_ci;
CREATE TABLE products (
productID INT UNSIGNED NOT NULL AUTO_INCREMENT,
title VARCHAR(104) NOT NULL,
picturePath VARCHAR(104) NULL,
pictureThumb VARCHAR(104) NULL,
creationDate DATE NOT NULL,
closeDate DATE NULL,
deleteDate DATE NULL,
varPath VARCHAR(104) NULL,
isPublic TINYINT(1) UNSIGNED NOT NULL DEFAULT '1',
PRIMARY KEY (productID)
) ENGINE = INNODB CHARACTER SET utf8 COLLATE utf8_unicode_ci;
CREATE TABLE productUsers (
productID INT UNSIGNED NOT NULL,
userID INT UNSIGNED NOT NULL,
permission VARCHAR(16) NOT NULL,
PRIMARY KEY (productID,userID),
FOREIGN KEY (productID) REFERENCES products (productID) ON DELETE RESTRICT ON UPDATE NO ACTION,
FOREIGN KEY (userID) REFERENCES users (userID) ON DELETE RESTRICT ON UPDATE NO ACTION
) ENGINE = INNODB CHARACTER SET utf8 COLLATE utf8_unicode_ci;
Хранимая процедура, которую я использую, такова:
CREATE PROCEDURE updateProductUsers (IN rUsername VARCHAR(24),IN rProductID INT UNSIGNED,IN rPerm VARCHAR(16))
BEGIN
UPDATE productUsers
INNER JOIN users
ON productUsers.userID = users.userID
SET productUsers.permission = rPerm
WHERE users.username = rUsername
AND productUsers.productID = rProductID;
END
Я тестировал с php, но та же ошибка дается с SQLyog. Я также протестировал воссоздание всей базы данных, но безрезультатно.
Любая помощь будет высоко ценится.
источник
COLLATE utf8_unicode_ci
к строковым константам:SET @EMAIL = 'abc@def.com' COLLATE utf8_unicode_ci;
. Это особенно полезно, если вы запускаете скрипт из консоли, где кодировка консоли по умолчанию применяется к сопоставлению ваших строковых констант.(utf8mb4_unicode_ci, IMPLICIT)
вместо(utf8_unicode_ci, IMPLICIT)
. Я удаляю данные из Интернета с помощью python, затем создаю CSV-файл со соскребенными данными, который затем обрабатываю с помощью файла PHP на моем сервере, который загружает данные в мою базу данных. все мои таблицы / столбцы MySQL сопоставлены какutf8mb4_unicode_ci
. Может ли проблема возникнуть, потому что я кодирую данные, какutf8
в Python / CSV?Я потратил полдня на поиск ответов на ту же ошибку «Недопустимое сочетание сопоставлений» с конфликтами между utf8_unicode_ci и utf8_general_ci.
Я обнаружил, что некоторые столбцы в моей базе данных не были специально сопоставлены utf8_unicode_ci . Кажется, MySQL неявно сопоставил эти столбцы utf8_general_ci .
В частности, при выполнении запроса 'SHOW CREATE TABLE table1' выдается что-то вроде следующего:
Обратите внимание, что строка 'col1' varchar (4) CHARACTER SET utf8 NOT NULL не имеет указанного сопоставления. Затем я запустил следующий запрос:
ALTER TABLE table1 CHANGE col1 col1 VARCHAR(4) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL;
Это решило мою ошибку «Неверное смешение сопоставлений». Надеюсь, что это может помочь кому-то еще там.
источник
COLLATE
всей таблицы (то естьALTER TABLE table1 CHARSET utf8 COLLATE utf8_unicode_ci
) не решит проблему , это должно быть сделано для каждого (проблемного) столбца.У меня была похожая проблема, но она возникла у меня внутри процедуры, когда мой параметр запроса был установлен с помощью переменной, например
SET @value='foo'
.Причиной этого было несоответствие
collation_connection
и сопоставление базы данных. Изменился,collation_connection
чтобы соответствовать,collation_database
и проблема ушла. Я думаю, что это более элегантный подход, чем добавление COLLATE после параметра / значения.Подводя итог: все сопоставления должны совпадать. Используйте
SHOW VARIABLES
и убедитесьcollation_connection
иcollation_database
сопоставьте (также проверьте сопоставление таблицы, используяSHOW TABLE STATUS [table_name]
).источник
SET @my_var = 'string1,string2' COLLATE utf8_unicode_ci;
Немного похожий на ответ @bpile, мой случай был настройкой записи my.cnf
collation-server = utf8_general_ci
. После того, как я понял это (и после попытки всего вышеописанного), я принудительно переключил свою базу данных на utf8_general_ci вместо utf8_unicode_ci, и это было так:источник
В моем собственном случае у меня следующая ошибка
Неверное сочетание параметров сортировки (utf8_general_ci, IMPLICIT) и (utf8_unicode_ci, IMPLICIT) для операции '='
После нескольких недель поиска в Google я заметил, что два поля, которые я сравниваю, состоят из разных имен сопоставлений. Первый, то есть имя пользователя, имеет utf8_general_ci, а второй - utf8_unicode_ci, поэтому я вернулся к структуре второй таблицы и изменил второе поле (matric_no) на utf8_general_ci, и оно работало как шарм.
источник
Несмотря на то, что я нашел огромное количество вопросов об одной и той же проблеме ( 1 , 2 , 3 , 4 ), я так и не нашел ответа, который бы учитывал производительность, даже здесь.
Хотя уже было дано несколько рабочих решений, я хотел бы рассмотреть вопрос о производительности.
РЕДАКТИРОВАТЬ: Спасибо Manatax за указание, что вариант 1 не страдает от проблем с производительностью.
Использование опций
1 и2 , также называемое методом приведения COLLATE , может привести к потенциальному узкому месту, поскольку любой индекс, определенный в столбце, не будет использоваться, что приведет к полному сканированию .Несмотря на то, что я не опробовал вариант 3 , я думаю, что он будет страдать от тех же последствий, что и вариант
1 и2.Наконец, вариант 4 - лучший вариант для очень больших таблиц, когда он жизнеспособен. Я имею в виду, что нет другого использования, которые основаны на исходной сортировке.
Рассмотрим этот упрощенный запрос:
В моем исходном примере у меня было еще много соединений. Конечно, table1 и table2 имеют разные параметры сортировки. Использование оператора collate для приведения приводит к тому, что индексы не используются.
См. Объяснение sql на картинке ниже.
Визуальное объяснение запроса при использовании приведения COLLATE
С другой стороны, вариант 4 может использовать преимущества возможного индекса и приводит к быстрым запросам.
На рисунке ниже вы можете увидеть тот же запрос, который выполняется после применения варианта 4 , то есть, изменения схемы / таблицы / столбца.
Визуальное объяснение запроса после изменения параметров сортировки и, следовательно, без преобразования
В заключение, если производительность важна и вы можете изменить параметры сортировки таблицы, перейдите к варианту 4 . Если вам нужно действовать на один столбец, вы можете использовать что-то вроде этого:
источник
Это происходит, когда для столбца явно задано другое сопоставление или сопоставление по умолчанию отличается в запрашиваемой таблице.
если у вас много таблиц, вы хотите изменить параметры сортировки при запуске этого запроса:
это выведет запросы, необходимые для преобразования всех таблиц, чтобы использовать правильное сопоставление для столбца
источник