JSON_TABLE
做测试发现一个诡异的错误提示:1267 => Illegal mix of collations (utf8mb4_general_ci,IMPLICIT) and (utf8mb4_0900_ai_ci,IMPLICIT) for operation '='。
前提:我这里的前提是几个表,字符集均确定是一致的 utf8_general_ci
,出现 1267 错误,其他情况如果表之间不一致,可以考虑用 CAST
或者 CONVERT
转换,甚至把 2 个字段转换,二进制 BINARY
方式等。
SQL => 1267 => Illegal mix of collations (utf8mb4_general_ci,IMPLICIT) and (utf8mb4_0900_ai_ci,IMPLICIT) for operation '='
一开始以为是需要显示的声明 JSON_TABLE
里字段的字符集(不同字符集排序不可以混用),用了 CAST
,但发现依然还是不行,用 SQLyog 没问题,脚本出这个问题,最后排查是因为连接 SET NAMES 写的有问题,MARK 一下。
在较新版本的 MySQL 中,推荐使用 SET NAMES
的同时,使用 SET CHARSET
以及 SET COLLATION
,而不是仅使用 SET NAMES
。这可以确保更准确的字符集和排序规则的设置
SET NAMES 'utf8mb4' COLLATE 'utf8mb4_general_ci' # 不仅仅是 SET NAMES 'utf8mb4' # 顺便设置连接 charset
注意:使用 JSON_TABLE 函数需要 MySQL 8.0.4 及以上版本的支持。