我遇到了类似的问题,正在尝试将 FIND_IN_SET 过程与字符串 variable 一起使用。
SET @my_var = 'string1,string2';
SELECT * from my_table WHERE FIND_IN_SET(column_name,@my_var);
并且收到错误
错误代码:1267。非法混合排序规则 (utf8_unicode_ci,IMPLICIT)
和 (utf8_general_ci,IMPLICIT) 用于操作“find_in_set”
简答:
无需更改任何 collation_YYYY 变量,只需在变量声明旁边添加正确的排序规则,即
SET @my_var = 'string1,string2' COLLATE utf8_unicode_ci;
SELECT * from my_table WHERE FIND_IN_SET(column_name,@my_var);
长答案:
我首先检查了排序规则变量:
mysql> SHOW VARIABLES LIKE 'collation%';
+----------------------+-----------------+
| Variable_name | Value |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
+----------------------+-----------------+
| collation_database | utf8_general_ci |
+----------------------+-----------------+
| collation_server | utf8_general_ci |
+----------------------+-----------------+
然后我检查了表格排序规则:
mysql> SHOW CREATE TABLE my_table;
CREATE TABLE `my_table` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`column_name` varchar(40) COLLATE utf8_unicode_ci DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=125 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
这意味着我的变量配置为默认排序规则 utf8_general_ci 而我的表配置为 utf8_unicode_ci。
通过在变量声明旁边添加 COLLATE 命令,变量排序规则与为表配置的排序规则匹配。