我是靠谱客的博主 孤独星星,最近开发中收集的这篇文章主要介绍[Mysql 8.0]Mysql从5.7升到8.0出现Illegal mix of collations排序规则异常的问题,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

系统数据库从5.7升级到8.0之后经常遇到字符集方面的问题。
其实这是因为在建库的时候,MySQL8.0默认的就是utf8mb4_0900_cl字符集和排序规则。
但是我们一般都是用utf8mb4_general_cl的字符规则,因此在建库、表、字段的时候需要人为指定相关配置。
下面是一段报错的代码:

SELECT 
RANK() over (ORDER BY DAA.M_TARGET,DAA.DATA_DATE)          RK,
@M_FLAG                                                    FG,

IF(@M_FLAG = DAA.M_TARGET, @FLAG := @FLAG + 1, @FLAG := 1) FLAG,
IF(IF(@M_FLAG = DAA.M_TARGET, @FLAG := @FLAG + 1, @FLAG := 1) > 1, @DIFF1 := EVT_VALUE,
                         @DIFF1 := 0)                                            DIFF,
IF(IF(@M_FLAG = DAA.M_TARGET, @FLAG := @FLAG + 1, @FLAG := 1) = 1, @DIFF2 := 0,
                         @DIFF2)                                                 DIF2,

@RATE := (@DIFF1 - @DIFF2)                                 LLR,
@DIFF2 := EVT_VALUE                                        EVT_VALUE,
@M_FLAG := DAA.M_TARGET                                    APT_FLAG

FROM (select @DIFF1 := 0, @DIFF2 := 0, @RATE := 0, @M_FLAG := '', @FLAG := 1) TMP,
sys_alarm_rule SARQ
LEFT JOIN dm_alarm_data DAA ON DAA.M_ID = SARQ.UUID

这一大段中,其实报错的部分就是中间用于IF判断的等式:

IF(@M_FLAG = DAA.M_TARGET, @FLAG := @FLAG + 1, @FLAG := 1) FLAG,
IF(IF(@M_FLAG = DAA.M_TARGET, @FLAG := @FLAG + 1, @FLAG := 1) > 1, @DIFF1 := EVT_VALUE,
                         @DIFF1 := 0)                                            DIFF,
IF(IF(@M_FLAG = DAA.M_TARGET, @FLAG := @FLAG + 1, @FLAG := 1) = 1, @DIFF2 := 0,
                         @DIFF2)                                                 DIF2,

初步怀疑是关联表、字段的排序规则设定为0900,经排查后发现关联用到的表字段的排序规则都是一样的utf8mb4_general_ci。
因为之前也发生过一样的报错,通过在my.inf里面直接设置排序规则,但是并没有生效。
经过一番搜索之后发现一条看起来有效的措施,将下面这条命令加入到my.inf之后确实生效了。
虽然查询collation还是有0900,但是至少原来的sql没有报错了。

skip-character-set-client-handshake

可能是数据库在重启过程中遇到了bug,没有执行这条命令导致,所以治标不治本的办法还是不行的。
首先查看排序变量的值,其中database和server都是general格式。但是connection和默认的都是0900。

show variables like '%coll%';

在这里插入图片描述

接下来就是进入数据库所在的Linux服务器尝试进行配置的修正。

set global collation_connection = 'utf8mb4_general_ci';

用root用户执行该条命名之后,在服务器里面再次查看排序变量发现connection的值已经被修改了。
但是在客户端的数据库管理软件中还是0900,关掉软件重新连接数据库之后再次查询发现配置已经被修改。
同时一开始报错的SQL也可以正常执行了。
在这里插入图片描述

但还是存在一个问题,就是经过反复修改之后,发现只能把connection的改成general,但是default的始终改不了。
同时也不确定数据库服务器下次重启之后,相关配置会不会又出现异常。

最后

以上就是孤独星星为你收集整理的[Mysql 8.0]Mysql从5.7升到8.0出现Illegal mix of collations排序规则异常的问题的全部内容,希望文章能够帮你解决[Mysql 8.0]Mysql从5.7升到8.0出现Illegal mix of collations排序规则异常的问题所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(43)

评论列表共有 0 条评论

立即
投稿
返回
顶部