1.现象
使用DataGrip连接MySQL 8,最近团队统一将数据库的CHARACTER SET调整为utf8mb4,COLLATE调整为UTF8MB4_GENERAL_CI后, 在DataGrip中经常提示类似错信息:
'llegal mix of collations (utf8mb4_general_ci,IMPLICIT) and (utf8mb4_0900_ai_ci,IMPLICIT) for operation '=''
困扰了许久,临时解决方案是在"="的其中一边加上COLLATE UTF8MB4_GENERAL_CI,如下:
selct * from tb_xxxx where user_name COLLATE UTF8MB4_GENERAL_CI =@user_name;
可临时解决,但始终麻烦,于是决定解决它!
2.解决过程
2.1.分析
提示等号两边是collations不一致,基本上可以确定服务器端collations肯定是UTF8MB4_GENERAL_CI,那么就是IDE里面定义的变量有问题?拿变量怎么会有排序字符集呢?难道是ide里有什么设置?但差找了IDE的所有字符集相关的地方,只有编码是UTF8,没发现跟排序字符集有关的地方。再看看环境变量吧。
2.2.MySQL环境
mysql> show variables like 'collation_%';
+----------------------+--------------------+
| Variable_name | Value |
+----------------------+--------------------+
| collation_connection | utf8mb4_general_ci |
| collation_database | utf8mb4_general_ci |
| collation_server | utf8mb4_general_ci |
+----------------------+--------------------+
3 rows in set (0.00 sec)
2.3.检查Datagrip环境
在ide里执行
SHOW VARIABLES LIKE 'COLLATION_%';
+----------------------+--------------------+
Variable_name Value
+----------------------+--------------------+
collation_connection utf8mb4_0900_ai_ci
collation_database utf8mb4_general_ci
collation_server utf8mb4_general_ci
+----------------------+--------------------+
发现Datagrip里面的collation_connection与MySQL cli中查出来的的不一致!
4.解决方案
考虑到Datagrip是通过jdbc驱动连接的,怀疑问题出现在jdbc的设置上。于是打开"Databases–>@localhost–>右击–>Properties–>General-URL",在URL上加上连接排序参数,结果如下:
jdbc:mysql://localhost:3306?connectionCollation=utf8mb4_general_ci
重启DataGrip,搞定!