概述
系统数据库从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排序规则异常的问题所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复