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 及以上版本的支持。