首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >操作'=‘的排序规则(utf8_unicode_ci,IMPLICIT)和(utf8_general_ci,IMPLICIT)的混合非法

操作'=‘的排序规则(utf8_unicode_ci,IMPLICIT)和(utf8_general_ci,IMPLICIT)的混合非法
EN

Stack Overflow用户
提问于 2012-08-02 10:05:04
回答 4查看 290.7K关注 0票数 184

MySql上的错误消息:

代码语言:javascript
复制
Illegal mix of collations (utf8_unicode_ci,IMPLICIT) and (utf8_general_ci,IMPLICIT) for operation '='

我已经通过了其他几个帖子,但无法解决这个问题。受影响的部分类似于以下内容:

代码语言:javascript
复制
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;

我使用的存储过程是这样的:

代码语言:javascript
复制
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也出现了同样的错误。我还测试了重建整个数据库,但没有好的结果。

任何帮助都将不胜感激。

EN

回答 4

Stack Overflow用户

发布于 2015-11-09 20:49:45

我也有过类似的问题,但在过程中,当我的查询参数是使用变量(例如SET @value='foo' )设置的时候,我就遇到了这个问题。

导致这种情况的原因是collation_connection和数据库排序规则不匹配。更改collation_connection以匹配collation_database,问题就消失了。我认为这是一种比在param/value后面添加COLLATE更优雅的方法。

总而言之:所有排序规则都必须匹配。使用SHOW VARIABLES并确保collation_connectioncollation_database匹配(还要使用SHOW TABLE STATUS [table_name]检查表排序)。

票数 7
EN

Stack Overflow用户

发布于 2016-07-05 17:40:03

我的例子有点类似于@bpile的答案,是一个设置了collation-server = utf8_general_ci的my.cnf条目。在我意识到这一点后(在尝试了上面的所有方法之后),我强制将我的数据库切换到utf8_general_ci而不是utf8_unicode_ci,就是这样:

代码语言:javascript
复制
ALTER DATABASE `db` CHARACTER SET utf8 COLLATE utf8_general_ci;
票数 5
EN

Stack Overflow用户

发布于 2020-10-08 11:06:04

答案是添加到@Sebas的答案-设置我的本地环境的排序规则。请勿在生产环境中尝试此操作。

代码语言:javascript
复制
ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci;

ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;

solution的源

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11770074

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档