非法混合sorting(utf8_unicode_ci,IMPLICIT)和(utf8_general_ci,IMPLICIT)进行操作'='
MySql上的错误消息:操作'='时,非法混合的sorting规则(utf8_unicode_ci,IMPLICIT)和(utf8_general_ci,IMPLICIT)
我已经经历了其他几个职位,无法解决这个问题。 受影响的部分与此类似:
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
我正在用PHPtesting,但同样的错误与SQLyog给出。 我也testing了重新创build整个数据库,但没有好处。
任何帮助都感激不尽。
您可能需要将COLLATE
添加到WHERE
子句中:
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; END
或将其添加到IN
参数定义中:
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; END
或改变领域本身:
ALTER TABLE users CHARACTER SET utf8 COLLATE utf8_general_ci;
因为存储过程参数的默认sorting规则是utf8_general_ci
,您不能混合sorting规则。
除非你需要按Unicode顺序对数据进行sorting,否则我会build议改变你所有的表来使用utf8_general_ci
sorting规则。
我花了半天的时间searchutf8_unicode_ci和utf8_general_ci之间的冲突错误的相同的“非法混合整理”错误的答案。
我发现我的数据库中的一些列没有专门整理utf8_unicode_ci 。 看来MySQL隐式地整理了这些列utf8_general_ci 。
具体来说,运行“SHOW CREATE TABLE table1”查询输出如下所示:
| table1 | CREATE TABLE `table1` ( `id` int(11) NOT NULL, `col1` varchar(4) CHARACTER SET utf8 NOT NULL, `col2` int(11) NOT NULL, PRIMARY KEY (`photo_id`,`tag`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci |
注意行'col1'varchar(4)CHARACTER SET utf8 NOT NULL没有指定的sorting规则。 然后我运行以下查询:
ALTER TABLE table1 CHANGE col1 col1 VARCHAR(4) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL;
这解决了我的“非法混合整理”错误。 希望这可能会帮助别人。
我有一个类似的问题,但它发生在我的程序内,当我的查询参数设置使用variables,例如SET @value='foo'
。
造成这种情况的原因是collation_connection
和Database collation不匹配。 更改了collation_connection
以匹配collation_database
,问题就消失了。 我认为这是比在param / value之后添加COLLATE更优雅的方法。
总结:所有sorting规则必须匹配。 使用SHOW VARIABLES
并确保collation_connection
和collation_database
匹配(也使用SHOW TABLE STATUS [table_name]
检查表格整理)。
有点类似@bpile答案,我的情况是一个my.cnf条目设置collation-server = utf8_general_ci
。 当我意识到(并尝试了上述所有内容)之后,我强制性地将数据库切换到utf8_general_ci而不是utf8_unicode_ci,那就是:
ALTER DATABASE `db` CHARACTER SET utf8 COLLATE utf8_general_ci;