暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL8联表查询报错(0x80004005)1267 - Illegal mix of collations的解决办法

数据中心知识 2023-05-15
1312

具体报错

    最近做公司数据库,并更新一点ERP源代码,遇到了一个常见的报错,现将报错、解决过程记录一下。

    具体的报错内容截屏如上图。

实际场景

    出现报错的详细场景:一台CentOS8的机器,操作系统版本为:CentOS Linux release 8.3.2011,没有安装桌面应用。安装了MySQL8社区版数据库服务器,数据库版本为:

mysql  Ver 8.0.31 for Linux on x86_64 (MySQL Community Server - GPL)。数据库文件放在一台NAS服务器映射过来的nfs共享路径上。NAS文件通过一台备份服务器,每天定时备份。

    ERP软件用的是vs.net写的,数据库最早是SQL Server 2008R2,今年移植到MySQL上的。数据库管理使用的是Navicat for MySQL 16.1.4 简体中文版。

解决过程

    根据调试内容中的报错,定位到报错是一条数据库语句执行错误,那就将生成的MySQL语句输出到textbox里面,然后复制这条语句,到Navicat for MySQL里面直接执行,执行的结果同样报错,报错内容为:1267 - Illegal mix of collations (utf8mb4_0900_ai_ci,IMPLICIT) and (utf8mb4_general_ci,IMPLICIT) for operation '='。

    那么问题就不是vs.net源代码的问题,而是出在了数据库一端。复制过来的数据库命令是个联表查询的语句,等于号"="两边是两个表的字段,两个字段都是varchar数据类型。查看两个字段发现,虽然两个字段都是使用的utf8mb4的字符集,排序规则选择的不一样。如下图。


    根据错误提示内容,将排序规则为utf8mb4_0900_ai_ci的字段做下修改,也改成utf8mb4_general_ci,保存数据表的修改。再次执行命令,执行成功。到ERP中执行,也正常完成。问题解决。

原因分析

    两个数据表,其中一个表是从之前的SQL Server迁移过来的,迁移之后设置了引擎和字符集,另一个是MySQL8下面新建的,虽然引擎和字符集没有问题,可是排序规则不一样,导致了两个字段不能够使用等于号"="来进行比较。


感谢各位的阅读,本公众号会持续分享实际的服务案例,若感兴趣请关注该公众号。

需要作者分享内容的资源,请关注此公众号,后台发送 【共享资源】 获取下载链接


需要上门解决问题时,请及时联系我们

更多案例文章,请点击!

文章转载自数据中心知识,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论