故障分析 | MySQL convert 函数导致的字符集报错处理

SQLSTATE[HY000]: General error: 1267 Illegal mix of collations (utf8_general_ci,IMPLICIT) and (gb231... SQLSTATE[HY000]: General error: 1267 Illegal mix of collations (utf8_general_ci,IMPLICIT) and (gb2312_chinese_ci,COERCIBLE) for operation '=' 在操作MySQL数据库时,报“ error code [12... 阅读详情

作者:徐耀荣

爱可生南区交付服务部 DBA 团队成员,主要负责MySQL故障处理以及相关技术支持。爱好电影,游戏,旅游以及桌球。

本文来源:原创投稿

*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。


一、问题背景

有客户之前遇到一个 mysql8.0.21 实例中排序规则的报错,是在调用视图时抛出,报错信息如下:

ERROR 1267 (HY000): Illegal mix of collations (utf8mb4_general_ci,IMPLICIT) and (utf8mb4_0900_ai_ci,IMPLICIT) for operation '='

二、问题模拟

mysql> show create table t1\G;
*************************** 1. row ***************************
       Table: t1
Create Table: CREATE TABLE `t1` (
  `name1` varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci
1 row in set (0.00 sec)

mysql> show create table t2\G;
*************************** 1. row ***************************
       Table: t2
Create Table: CREATE TABLE `t2` (
  `name2` varchar(12) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

mysql> CREATE VIEW t3 as select * from t1,t2 where `t1`.`name1`= `t2`.`name2`;
Query OK, 0 rows affected (0.06 sec)

mysql> select * from t3;
ERROR 1267 (HY000): Illegal mix of collations (utf8mb4_general_ci,IMPLICIT) and (utf8mb4_0900_ai_ci,IMPLICIT) for operation '='

三、问题分析

通过查看视图定义,可以发现由于视图中涉及到的两张表字符集不同,所以创建视图时 MySQL 会自动使用 convert 函数转换字符集。

mysql> show create view t3\G;
*************************** 1. row ***************************
                View: t3
         Create View: CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `t3` AS select `t1`.`name1` AS `name1`,`t2`.`name2` AS `name2` from (`t1` join `t2`) where (`t1`.`name1` = convert(`t2`.`name2` using utf8mb4))
character_set_client: utf8mb4
collation_connection: utf8mb4_general_ci
1 row in set (0.00 sec)

在 MySQL 8.0 中 utf8mb4 的默认排序规则为 utf8mb4_0900_ai_ci ,而在 t1 表的排序规则为 utf8mb4_general_ci ,那么我们试着将排序规则相关的参数修改后再执行 SQL 看看,修改后的环境参数如下

mysql> show variables like '%collat%';
+-------------------------------+--------------------+
| Variable_name                 | Value              |
+-------------------------------+--------------------+
| collation_connection          | utf8mb4_general_ci |
| collation_database            | utf8mb4_bin        |
| collation_server              | utf8mb4_bin        |
| default_collation_for_utf8mb4 | utf8mb4_general_ci |
+-------------------------------+--------------------+

再次执行 sql 发现还是会报一样的错。

mysql> select * from t1,t2 where `t1`.`name1`=convert(`t2`.`name2` using utf8mb4);
ERROR 1267 (HY000): Illegal mix of collations (utf8mb4_general_ci,IMPLICIT) and (utf8mb4_0900_ai_ci,IMPLICIT) for operation '='

通过 show collation 来查看 utf8mb4 字符集对应的默认排序规则,输出显示默认规则为 utf8mb4_general_ci ,并不是 utf8mb4_0900_ai_ci 。

mysql> show collation like '%utf8mb4%';
+----------------------------+---------+-----+---------+----------+---------+---------------+
| Collation                  | Charset | Id  | Default | Compiled | Sortlen | Pad_attribute |
+----------------------------+---------+-----+---------+----------+---------+---------------+
| utf8mb4_general_ci         | utf8mb4 |  45 | Yes     | Yes      |       1 | PAD SPACE     |
+----------------------------+---------+-----+---------+----------+---------+---------------+

mysql> show character set like '%utf8mb4%';
+---------+---------------+--------------------+--------+
| Charset | Description   | Default collation  | Maxlen |
+---------+---------------+--------------------+--------+
| utf8mb4 | UTF-8 Unicode | utf8mb4_general_ci |      4 |
+---------+---------------+--------------------+--------+
1 row in set (0.00 sec)

继续排查发现元数据中的字符集默认排序规则如下,默认规则为 utf8mb4_0900_ai_ci 。

mysql>  select * from INFORMATION_SCHEMA.COLLATIONS where IS_DEFAULT='Yes' and CHARACTER_SET_NAME='utf8mb4'\G;
*************************** 1. row ***************************
    COLLATION_NAME: utf8mb4_0900_ai_ci
CHARACTER_SET_NAME: utf8mb4
                ID: 255
        IS_DEFAULT: Yes
       IS_COMPILED: Yes
           SORTLEN: 0
     PAD_ATTRIBUTE: NO PAD
1 row in set (0.00 sec)

检查参数发现,元数据信息中 utf8mb4 字符集默认排序规则是 utf8mb4_0900_ai_ci ,show collation/show character 输出的都是 utf8mb4_general_ci 。为什么 show 显示的结果和 INFORMATION_SCHEMA.COLLATIONS 表查到的信息还不一样呢?此处我们暂且按下不表,咱们先看看官方文档中 convert 函数用法,其中有下面这段原文:

If you specify CHARACTER SET charset_name as just shown, the character set and collation of the result are charset_name and the default collation of charset_name. If you omit CHARACTER SET charset_name, the character set and collation of the result are defined by the character_set_connection and collation_connection system variables that determine the default connection character set and collation (see Section 10.4, “Connection Character Sets and Collations”).

从上述原文可知如果 convert 只指定了字符集,那么该结果的排序规则就是所指定字符集的默认规则,由之前的测试情况可知,convert 使用的是 INFORMATION_SCHEMA.COLLATIONS 的排序规则,而不是 default_collation_for_utf8mb4 指定的 utf8mb4_general_ci ,那我们来看看 default_collation_for_utf8mb4 参数主要作用场景:

  1. SHOW COLLATION and SHOW CHARACTER SET.
  2. CREATE TABLE and ALTER TABLE having a CHARACTER SET utf8mb4 clause without a COLLATION clause, either for the table character set or for a column character set.
  3. CREATE DATABASE and ALTER DATABASE having a CHARACTER SET utf8mb4 clause without a COLLATION clause.
  4. Any statement containing a string literal of the form _utf8mb4’some text’ without a COLLATE clause.

其中,第一点解释了为什么 show 查到的信息和元数据中信息不一样,default_collation_for_utf8mb4 修改后影响 show COLLATION and SHOW CHARACTER SET 的查询结果,并不会改变字符集的默认排序规则,所以utf8mb4 的默认规则还是 utf8mb4_0900_ai_ci ,sql 执行依然会报错。

将 convert 函数指定为 t1.name1 字段的排序规则后,sql 执行正常。

mysql> select * from t1,t2 where `t1`.`name1` = convert(`t2`.`name2` using utf8mb4) collate utf8mb4_general_ci;
+-------+-------+
| name1 | name2 |
+-------+-------+
| jack  | jack  |
+-------+-------+
1 row in set (0.00 sec)

另外,下面测试可以验证 default_collation_for_utf8mb4 的第四个场景。

mysql> select * from INFORMATION_SCHEMA.COLLATIONS where IS_DEFAULT='Yes' and CHARACTER_SET_NAME='utf8mb4'\G;
*************************** 1. row ***************************
    COLLATION_NAME: utf8mb4_0900_ai_ci
CHARACTER_SET_NAME: utf8mb4
                ID: 255
        IS_DEFAULT: Yes
       IS_COMPILED: Yes
           SORTLEN: 0
     PAD_ATTRIBUTE: NO PAD
1 row in set (0.00 sec)

mysql> show variables like '%default_collation%';
+-------------------------------+--------------------+
| Variable_name                 | Value              |
+-------------------------------+--------------------+
| default_collation_for_utf8mb4 | utf8mb4_general_ci |
+-------------------------------+--------------------+
1 row in set (0.01 sec)

mysql> set @s1 = _utf8mb4 'jack',@s2 = _utf8mb4 'jack';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @s1 = @s2;
+-----------+
| @s1 = @s2 |
+-----------+
|         1 |
+-----------+
1 row in set (0.00 sec)
_utf8mb4声明的@s1和@s2排序规则是default_collation_for_utf8mb4参数值,为utf8mb4_general_ci

mysql> SELECT @s1 = CONVERT(@s2 USING utf8mb4);
ERROR 1267 (HY000): Illegal mix of collations (utf8mb4_general_ci,IMPLICIT) and (utf8mb4_0900_ai_ci,IMPLICIT) for operation '='
此时,经过CONVERT函数处理的@s2排序规则是utf8mb4_0900_ai_ci,所以会报错

mysql> SELECT @s1 = CONVERT(@s2 USING utf8mb4) collate utf8mb4_general_ci;
+-------------------------------------------------------------+
| @s1 = CONVERT(@s2 USING utf8mb4) collate utf8mb4_general_ci |
+-------------------------------------------------------------+
|                                                                 1 |
+-------------------------------------------------------------+
1 row in set (0.00 sec)

四、问题总结

运维中为避免字符集引起的报错问题,有如下建议可供参考:(具体参数值根据业务需求选择)

  • 创建数据库实例时需指定参数 character_set_database(默认值:utf8mb4),character_set_server(默认值:utf8mb4)。
  • 当需要创建非默认字符集 database / table 时,需要在 sql 中明确指定字符集和排序规则。
  • 使用convert函数转换字符集时,当字段排序规则不是转换后字符集的默认排序规则,需要指定具体的排序规则。SELECT @s1 = CONVERT(@s2 USING utf8mb4) collate utf8mb4_general_ci
  • MySQL 5.7迁移至MySQL 8.0时,需注意MySQL 5.7版本中utf8mb4默认排序规则是 utf8mb4_general_ci,MySQL 8.0中 utf8mb4 默认排序规则是 utf8mb4_0900_ai_ci 。

参考

https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html

https://dev.mysql.com/doc/refman/8.0/en/charset-connection.html

https://dev.mysql.com/doc/refman/8.0/en/cast-functions.html#function_convert

关于SQLException: Illegal mix of collations (`utf8mb4_general_ci,IMPLICIT`)...错误 关于异常解决:Cause: java.sql.SQLException: Illegal mix of collations (utf8mb4_general_ci,IMPLICIT) and (utf8mb4_0900_ai_ci,IMPLICIT) for operation '=' 阅读详情

相关推荐

直流耦合系统介绍

参考《SMA如何使用直流耦合技术实现更高效的光伏电站-白皮书》

圆桌骑士的博客 731

mysql报错[1267] [HY000]: Illegal mix of collations (utf8mb4_0900_ai_ci,IMPLICIT) and (utf8mb4_general_

执行mysql的时候报错[1267] [HY000]: Illegal mix of collatio,连表查询的sql语法没有写错,其实这个原因是两张表的这两个字段的字符集和排序规则不一样,不能直接进行比较,所以才报这个错。我第一张表的排序规则是utf8mb4_0900_ai_ci,而第二张表的排序顺序是utf8mb4_general_ci,这两个不一样导致的。这里我选择把第一张表的排序方法改为和第二张表的一样的utf8mb4_general_ci,具体的话得看你的需求了。再去执行查询语句,就没有报错了。

没有简介就是简介 4172

TC275-AutoSAR实战:Davinci Cfg多核OS配置与调试技巧

本文详细介绍了在TC275芯片上使用Davinci Cfg工具进行AutoSAR多核操作系统配置的实战步骤与调试技巧。内容涵盖从导入arxml文件的常见“坑”开始,到配置Det、EcuC、创建多核OS实例、关联OS应用、创建任务与设置优先级调度,最后分享了利用Det日志、调试器多核视图及处理核间通信与缓存一致性等关键调试方法,旨在帮助开发者高效完成复杂车载ECU软件集成。

weixin_29219189的博客 488

MySQL执行异常: Illegal mix of collations (utf8mb4_0900_ai_ci IMPLICIT) and (utf8mb4_general_ci...

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar

zsxcomputer的博客 1万+

二、租用AutoDL服务器与连接教程

点击右上角控制台,选择【租用新的实例】;,我这里使用的是xshell和xftp工具(自行下载)。打开本地目录和服务器目录,直接拖动文件。

zzf021122的博客 1325

ChromeOS安装教程

ChromeOS,是基于Linux内核研发的ChromiumOS开源系统的闭源系统,最大的特色就是内置了Chrome浏览器,早期主要以Web云端应用程序为主,后来逐渐引入了Android子系统和Linux子系统。本文主要简述摸索的家用笔记本安装ChromeOS安装方法,供各位玩机朋友参考。

weixin_45751495的博客 8109

mysql 错误码: 1267

报错:Illegal mix of collations (utf8mb4_0900_ai_ci,IMPLICIT) and (utf8mb4_general_ci,IMPLICIT) for operat

怪咖@的博客 1万+

MySQL convert函数导致的字符集错误场景

用过Oracle和MySQL的朋友,对其中使用上的一些区别,就会比较敏感,例如字符集,就算其中一个,Oracle除了建库会指定字符集外,好像很少提到了,而MySQL中创建表的时候可能都会指定字符集,还可能导致出现隐式转换(可参考《MySQL隐式转换案例一则》《Oracle、SQL Server和MySQL的隐式转换异同》),都需要格外关注。碰巧看到社区退的这篇文章《故障分析 | MySQL con...

bisal的专栏 745

OpenCV实战之人脸美颜美型(八)——大眼(下)

我们需要将上述描述量化表达,以r代表上述变形区域的圆的半径,X表示原始图像像素到变形圆圆心的距离,Y表示像素变形后的其距离变形圆圆心的距离,则其形状大致如下图所示。如下图所示,我们可以规定处理区域为眼睛为圆心的一个圆形,从圆心区域开始图像会放大,但该放大的比例随着距离圆心的距离而变小,直至边缘区域的放大比例为0。不过在实际图像变形操作中我们要从目标图像映射到原图,因此我们需要将X/Y调换,让X表示变形后图像的像素距离变形圆中心的距离,Y表示原图像素距离变形圆中心的距离,则其形状如下图所示。

On my way 901

ESD防护设计宝典(十一):CE(传导发射)超标问题排查与解决

(Conducted Emission, CE),亦称为传导骚扰,是电子电气设备或系统内部的电压、电流通过信号线、电源线或地线向外传输,对其他电子电气设备或系统造成电磁干扰的物理现象。其。

m0_56451176的博客 855

【无标题】报错[HY000][1267] Illegal mix of collations (utf8mb4_0900_ai_ci,IMPLICIT) and (utf8mb4_general_ci

出现[HY000][1267] Illegal mix of collations (utf8mb4_0900_ai_ci,IMPLICIT) and (utf8mb4_general_ci,IMPLICIT) for operation '=' 报错

Thebun的博客 1970

昇腾,Ascend,NPU,mindie,镜像,部署vllm:第5篇,昇腾环境下部署蒸馏版deepseek-r1,并在dify中注册模型供应商

这两天没少折腾deepseek-r1。之前在A100上用ollama部署了一份DeepSeek-R1-Distill-Qwen-32B,感觉真的特别慢。现在,再用昇腾部署一遍,看看速度能不能更快。p.s. 类似的内容其实已经写了很多遍了。但感觉之前写得都太碎,不够顺畅。接着新模型写篇长文,把能包括的都包括进来。这样大家也不需要到处翻来翻去。

xiezhipu的博客 2450

mysql报错1267 - Illegal mix of collations解决方法

我输入下面代码错误这个错误是由于在执行查询时,两个表的字符集排序规则(collation)不一致。

猪猪侠 3093

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Mysql 视图查询 编码格式异常 ERROR 1267 (HY000): Illegal mix of collations (utf8mb4_general_ci

1、线上库存在一张表原始表table_A ,查询A是正常的2、创建视图表table_B,创建正常3、查询视图表B,报错。

qq_34819372的博客 2586

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Mysql [HY000][1267] Illegal mix of collations (utf8mb4_general_ci,IMPLICIT) 终极解决方案

也许你遇到这个错误后找了很多答案,运行了诸如ALTER TABLE table_name convert to CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci等千奇百怪的命令还是无用。不妨试试使用重新创建一个数据库,因为遇到这种问题估计也是在比较初期的时候发现的。用下面的命令创建一个新的数据库,自行还原数据即可。

GB2102的博客 2089

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

【MySQL】报错1267 - Illegal mix of collations (utf8mb4_unicode_ci,IMPLICIT) and (utf8mb4_general_ci,IMPL

记录一次sql语句执行错误:left join表会出现 Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8_croatian_ci,IMPLICIT) for operation '='错误.这是由于表的编码格式不一致 例如 某个表的字符编码为utf8_general_ci而关联表的字符编码为utf8_croatian_ci导致当前错误!

A-Itfuture的博客 1万+

ERROR 1267 (HY000): Illegal mix of collations (utf8_general_ci,IMPLICIT) and (gbk_chinese_ci,COERCIB

在查询时,反馈了如下错误: ERROR 1267 (HY000): Illegal mix of collations (utf8_general_ci,IMPLICIT) and (gbk_chinese_ci,COERCIBLE) for operation 'like' mysql> show variables like '%coll%'; +------------------

雅冰石的专栏 1万+

数据库工具报错记录[HY000][1267] Illegal mix of collations (utf8mb4_general_ci,IMPLICIT) and (utf8mb4_0900_ai_

在链接地址?connectionCollation=utf8mb4_general_ci指定下 或者下面方式 出现这种问题就是关联表的字符集不匹配 1.查看数据库的字符集 show variables where Variable_name like 'collation%'; 结果: 2.查看关联表字符集 show create table table_name; 3.给关联表设置字符编码 alter table table_name default character s

qq_43393995的博客 3054

[Err] 1267 - Illegal mix of collations (utf8mb4_general_ci,IMPLICIT) and (utf8mb4_0900_ai_ci,IMPLICI

用navicat(其它工具一样)查询sql语句,报错: 分析:异常是排序规则编码混乱;我mysql是8.0.12版本,本次sql操作是连表查询,应该是两个表的编码格式不同所致,mysql8.0.1之后的默认COLLATE为utf8mb4_0900_ai_ci; 查看当前数据库默认编码: show variables where Variable_name like ‘collation%’; !...

weixin_41720239的博客 2万+

mysql ERROR 1267 (HY000): Illegal mix of collations (utf8mb4_general_ci,COERCIBLE) ....

迁移服务器时,重建mysql数据库,将数据库的编码格式改为了utf8mb4(见该篇),以便能够存储emoji表情.在遇到一个执行procedure报错 : call TigAddUserPlainPw(‘db-properties’, NULL);ERROR 1267 (HY000): Illegal mix of collations (utf8mb4_general_ci,COERCIBLE)

sunweijm的博客 5243

mysql表之间关联查询报错:1267 - Illegal mix of collations (utf8mb4_0900_ai_ci,IMPLICIT) and (utf8mb4_general_c

1.问题描述: 在进行两个数据表联合查询时,由于数据库编码不一致,导致查询的时候报错 1267 - Illegal mix of collations (utf8mb4_0900_ai_ci,IMPLICIT) and (utf8mb4_general_ci,IMPLICIT) for operation ‘=’ 2.问题解决 需要增加关联字段的转换即可 语法 convert(‘column’ using’ utf8) SELECT dc.id,dc.data_id,dc.data_ruid,dc

后端开发 5851

mysql convert报错_部署mysql版本项目问题记录

一,com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure报错将url从jdbc:mysql://localhost:3306/datashare?useUnicode=true&characterEncoding=utf-8&useSSL=true改为jdbc:mysql:...

weixin_29958123的博客 570

Error 1267 Illegal mix of collations (utf8mb4_unicode_ci,IMPLICIT) and (utf8mb4_general_ci,IMPLICIT

Mysql 报错: `Error 1267 Illegal mix of collations (utf8mb4_unicode_ci,IMPLICIT) and (utf8mb4_general_ci,IMPLICIT) for operation ‘=’ 1.问题 mysql字符集不匹配导致比较时出错。 这种问题可能出现在Mysql函数,存储过程运行时 2.原因 使用的mysql的字符集与表...

说文科技,做有态度的研究。 2万+

MySql报错:Illegal mix of collations (utf8mb4_0900_ai_ci,IMPLICIT) and (utf8mb4_general_ci,IMPLICIT)

MySql报错:Cause:java.sql.SQLException:Illegalmixofcollations(utf8mb4_0900_ai_ci,IMPLICIT)and(utf8mb4_general_ci,IMPLICIT)foroperation’=’;原因:数据库表或列排序规则不统一。

m0_67391870的博客 3108
上一篇: 故障分析 | Redis AOF 重写源码分析
下一篇: 故障分析 | MySQL convert 函数导致的字符集报错处理
爱可生开源社区
博客等级 码龄8年 1936粉丝 1004原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值