MySQL Error number: MY-012835; Symbol: ER_IB_MSG_1010; SQLSTATE: HY000

文档解释

Error number: MY-012835; Symbol: ER_IB_MSG_1010; SQLSTATE: HY000

Message: %s

错误说明:

MY-012835 为MySQL数据库定义的系统错误,其中ER_IB_MSG_1010为Error Message name,HY000为SQLSTATE值,ER_IB_MSG_1010错误消息指示的是在使用InnoDB引擎存储引擎时,对某些SQL语句进行存储时发生错误,提示“Illegal mix of collations ‘(NULL)’ and ‘(NULL)’ for operation ‘XX’”。

常见案例

ER_IB_MSG_1010错误一般是在MySQL语句中使用InnoDB存储引擎时出现,比如INSERT INTO TABLE或UPDATE TABLE表达式。这些操作尝试将不同的比较标准(比较标准定义了以什么样的比较符号在查询的结果中结合)组合在一起,导致系统返回ER_IB_MSG_1010错误。

例如,当使用下面的查询时,会收到ER_IB_MSG_1010错误:

SELECT * FROM tbl WHERE col1=”abc” AND col2=”def”

其中col1的比较标准是utf8mb4_unicode_ci,而col2的比较标准是utf8_general_ci,换句话说,它们使用不同的字符集和比较标准,这是不允许在InnoDB存储引擎中进行操作的。

解决方法:

对于ER_IB_MSG_1010错误,主要的解决方法就是确保所有列使用同一个比较标准或字符集。例如,上面的查询需要将col1和col2均改为使用utf8mb4_unicode_ci比较标准才能解决此错误。这可以通过以下方式完成:

ALTER TABLE tbl MODIFY col1 VARCHAR(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

ALTER TABLE tbl MODIFY col2 VARCHAR(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

如果用户没有足够的权限来修改列的比较标准,也可以手动运行下面的查询:

INSERT INTO tbl

SELECT col1 , col2

FROM ( SELECT CONVERT( col1 USING utf8mb4 ) col1 ,

CONVERT( col2 USING utf8mb4 ) col2

FROM tbl

) AS tbl

另外,用户可以在SQL查询中使用CONVERT函数确保所有字符串使用一致的比较标准。

总之,ER_IB_MSG_1010错误是由于比较标准之间存在不一致性,从而导致InnoDB无法正确处理输入的数据。为了解决此错误,可以通过以上方式改变表中指定列的比较标准,或者在SQL查询中使用CONVERT函数,以确保将所有字符串转换成相同的比较标准。

你可能感兴趣的