当前位置: 首页 > 面试题库 >

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

宦宏爽
2023-03-14
问题内容

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给出了相同的错误。我还测试了重新创建整个数据库,但效果不佳。

任何帮助都感激不尽。


问题答案:

存储过程参数的默认排序规则为utf8_general_ci并且您不能混合排序规则,因此有四个选项:

选项1添加COLLATE到您的输入变量中:

SET @rUsername = ‘aname’ COLLATE utf8_unicode_ci; -- COLLATE added
CALL updateProductUsers(@rUsername, @rProductID, @rPerm);

选项2COLLATEWHERE条款中添加

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

选项3 :将其添加到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

选项4 :更改字段本身:

ALTER TABLE users CHARACTER SET utf8 COLLATE utf8_general_ci;

除非您需要按Unicode顺序对数据进行排序,否则我建议您更改所有表以使用 utf8_general_ci排序规则,因为它不需要更改代码,并且会稍微加快排序速度。

更新 :utf8mb4 /
utf8mb4_unicode_ci现在是首选的字符集/排序规则方法。建议不要使用utf8_general_ci,因为性能提升可忽略不计。参见https://stackoverflow.com/a/766996/1432614



 类似资料:
  • 在我的remove服务器上执行MySQL中的存储过程时,如下所示: 我收到的错误消息为: 操作“=”的排序规则(utf8_unicode_ci,IMPLICIT)和(utf8_general_ci,IMPLICIT)的非法混合 下面是我的数据库中带有查询的表的屏幕截图,如下所示: 这个表quick_tables.bck只是因为名字中的.bck而卡在那里。但它并不存在于我的代码中。 下面是带有SQL

  • 在my remove服务器上执行MySQL中的存储过程,如下所示: 我收到错误消息如下: 操作“=”的排序规则(utf8_unicode_ci,隐式)和(utf8_general_ci,隐式)的非法混合 要使存储过程运行,应该进行哪些更改?

  • 问题内容: 查看我的产品日志后,我提到了一些错误: Alghout我在cfg教义下拥有UTF-8默认值: 看来我所有的MySQL表都在其中,所以我的问题是: 我可以为所有表手动将排序规则更改为,而没有任何复杂性/注意事项吗? 问题答案: 了解以下定义会有所帮助: 甲 字符编码 信息的每个符号是如何以二进制表示(并因此存储在计算机)。例如,符号(U + 00E9,拉丁小字母E急性)被编码为在UTF-

  • 问题内容: 在处理大量数据时出现此奇怪的错误… 我该怎么解决?我可以以某种方式转义字符串,以免发生此错误,还是我需要以某种方式更改表编码,如果是,应该将其更改为什么? 问题答案: 然后为您的数据库 MySQL有时会毫无理智地潜入瑞典。

  • 问题内容: 刚刚从上一个问题得到了这个答案,就可以了! 但是当我在其中添加额外的位时会出现以下错误: 文档#1267-操作’=’的排序规则(latin1_swedish_ci,IMPLICIT)和(latin1_general_ci,IMPLICIT)的非法混合 该表是: 问题答案: 检查每个表的排序规则类型,并确保它们具有相同的排序规则。 之后,还要检查您在操作中使用的每个表字段的排序规则类型。

  • 在猫的Scala中: 每当我们为Future调用Functor时,无论是直接使用Functor.apply还是通过map扩展方法间接调用,编译器都会通过隐式解析定位futureFunctor,并在调用位置递归搜索ExecutionContext。这可能是扩展的样子: 好吧,我试试: 但有一个例外: 错误:(29, 10) 找不到参数实例的隐式值:cats。Functor[scala.concurr