更新:utf8mb4/utf8mb4_unicode_ci现在是首选的字符集/排序规则方法.建议不要使用utf8_general_ci,因为性能提升可忽略不计.参见 https://stackoverflow.com/a/766996/1432614 Error message on MySql:Illegal mix of collations (utf8_unicode_ci,IMPLICIT) and (utf8_general_ci,IMPLICIT) for operation '='I have gone through several other posts and was not able to solve this problem.The part affected is something similar to this: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;The stored procedure I'm using is this: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;ENDI was testing with php, but the same error is given with SQLyog.I have also tested recreating the entire DB but to no good.Any help will be much appreciated. 解决方案 The default collation for stored procedure parameters is utf8_general_ci and you can't mix collations, so you have four options:Option 1: add COLLATE to your input variable:SET @rUsername = ‘aname’ COLLATE utf8_unicode_ci; -- COLLATE addedCALL updateProductUsers(@rUsername, @rProductID, @rPerm);Option 2: add COLLATE to the WHERE clause: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 COLLATE utf8_unicode_ci -- COLLATE added AND productUsers.productID = rProductID;ENDOption 3: add it to the IN parameter definition:CREATE PROCEDURE updateProductUsers( IN rUsername VARCHAR(24) COLLATE utf8_unicode_ci, -- COLLATE added 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;ENDOption 4: alter the field itself:ALTER TABLE users CHARACTER SET utf8 COLLATE utf8_general_ci;UPDATE: utf8mb4/utf8mb4_unicode_ci is now the preferred character set/collation method. utf8_general_ci is advised against, as the performance improvement is negligible. See https://stackoverflow.com/a/766996/1432614 这篇关于操作'='的排序规则(utf8_unicode_ci,IMPLICIT)和(utf8_general_ci,IMPLICIT)的非法混合的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!
09-13 22:17