网易首页 > 网易号 > 正文 申请入驻

【179期】一条诡异的 insert 语句,问题分析及排查过程!

0
分享至

点击上方“Java精选”,选择“设为星标”

别问别人为什么,多问自己凭什么!

下方有惊喜,留言必回,有问必答!

每天08:35更新文章,每天进步一点点...

问题背景

有同事反馈在mysql上面执行一条普通的insert语句,结果报错,

execute failed due to >>> Incorrect string value: '\xA1;offl...' for column 'biz_info' at row 1

经过半天的折腾,终于搞清楚了来龙去脉,这里简单给大家分享下。为了方便说明,我将测试例子中的表和语句简化,但不影响问题重现。

问题复现 连接字符集:UTF8

表结构:

CREATE TABLE `ggg` (
`id` int(11) DEFAULT NULL,
`c` varchar(100) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
root@test 06:13:48>insert into ggg values(1,concat('cardName:校园网',char(59),'offlineCardType:campus'));
Query OK, 1 row affected, 1 warning (2.51 sec)
root@test 06:14:36>show warnings\G
*************************** 1. row ***************************
Level: Warning
Code: 1366
Message: Incorrect string value: '\x91;offl...' for column 'c' at row 1

查看结果

root@test 06:16:06>select * from ggg where id=1;
*************************** 1. row ***************************
id: 1
c: cardName:鏍″洯缃
问题分析

从报错的结果来看,感觉是字符集转换引起的问题,而且由于连接串的字符集是UTF8,表的字符集是GBK,更容易引起怀疑。但是,即使是字符集转换,也不应该导致插入报错,因为语句中的中文字符“校园网"都是普通汉字,UTF8->GBK不应该存在问题。

那我们在回过头来看看insert语句,唯一特殊的是使用了concat和char两个函数。会不会跟这两个函数有关系?char(59)实际是字符“;”,为了验证想法,做了两个实验:

将char(59)替换成';'

insert into ggg values(1,concat('cardName:校园网',';','offlineCardType:campus'));
设置连接串字符集为GBK
insert into ggg values(1,concat('cardName:校园网',char(59),'offlineCardType:campus'));

果然,两种情况执行结果都是OK的,查询结果如下:

root@test 09:22:32>select * from ggg\G
*************************** 1. row ***************************
id: 1
c: cardName:鏍″洯缃
*************************** 2. row ***************************
id: 1
c: cardName:校园网;offlineCardType:campus
*************************** 3. row ***************************
id: 1
c: cardName:校园网;offlineCardType:campus

跟踪了下源代码,找到了原因。char()函数返回的是一个binary类型字符串,在进行concat时,会导致'cardName:校园网'字符串到binary的转换

由于目标表字符集是GBK,因此在入库时,还会发生一次binary到GBK的转码,“校园网”的二级制编码是E6A0A1 E59BAD E58DA1,在转码过程中,由于GBK字符集只包含一个字节(编码值<128)和二个字节的字符(汉字和特殊字符),“校园网”的二进制串会按照两个字节拆分E6A0 A1E5 9BAD E58D A1,前面四个变为“鏍″洯缃”,解析到A1时,由于A1既不是单字节字符,又不能与后面的字节组成一个合法的GBK字符,导致转换出错。

现在就很好解释为啥改变语句后,两种情况都OK了。第一种情况,将char(59)直接替换成‘;’,由于不涉及UF8到binary的转换,只有utf8到gbk转码的过程,这个转换是OK的,不会出现乱码;第二种情况,将连接串的字符集设置为GBK,那么会涉及GBK到binary的转换,然后再从binary转换到GBK,由于整个转换过程并没有二进制数据丢失,所以也是OK的。

问题产生的两个关键点

1. 连接字符集与表字符集不匹配;

2. 使用了char函数。

解决办法

1. char函数提供了using语法来实现返回特定字符集的字符串,比如:char(59 using utf8);

2. 保证连接字符集与表字符集一致。

作者:天士梦 https://www.cnblogs.com/cchust/p/4601536.html

公众号“Java精选”所发表内容注明来源的,版权归原出处所有(无法查证版权的或者未注明出处的均来自网络,系转载,转载的目的在于传递更多信息,版权属于原作者。如有侵权,请联系,笔者会第一时间删除处理!

------ THE END ------

精品资料,超赞福利!


3000+ 道面试题在线刷,最新、最全 Java 面试题!

期往精选 点击标题可跳转

技术交流群!

最近有很多人问,有没有读者&异性交流群,你懂的!想知道如何加入。加入方式很简单,有兴趣的同学,只需要点击下方卡片,回复“加群”,即可免费加入交流群!

文章有帮助的话,在看,转发吧!

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
季后赛被横扫后就退役!湖人离队第一人!三年“躺赚”3300万美元

季后赛被横扫后就退役!湖人离队第一人!三年“躺赚”3300万美元

鸣哥说体育
2026-05-12 18:44:49
第一次感受到维C的“杀伤力”,2块钱一瓶,就能搞定8个麻烦事

第一次感受到维C的“杀伤力”,2块钱一瓶,就能搞定8个麻烦事

室内设计师有料儿
2026-05-09 10:26:26
B&H把苹果新本价格打穿了:Pro直降400刀

B&H把苹果新本价格打穿了:Pro直降400刀

闪存猎手
2026-05-12 08:33:32
中方一锤定音给特朗普最高礼遇,普京通告全球:中俄关系独一无二

中方一锤定音给特朗普最高礼遇,普京通告全球:中俄关系独一无二

混沌录
2026-05-12 22:16:11
亚洲杯太残酷了:随着中国2-0,日本3-1,2大劲旅已经被送回家

亚洲杯太残酷了:随着中国2-0,日本3-1,2大劲旅已经被送回家

侧身凌空斩
2026-05-13 02:00:18
高三晒家长“开天窗”穿搭,被嘲:该端庄的时候,你解扣子干嘛?

高三晒家长“开天窗”穿搭,被嘲:该端庄的时候,你解扣子干嘛?

妍妍教育日记
2026-05-10 11:50:07
65岁男人和37岁女人再婚,女人:他老折腾我,男人:夫妻就这样

65岁男人和37岁女人再婚,女人:他老折腾我,男人:夫妻就这样

惟来
2026-05-12 08:56:37
梁靖崑发文总结世乒赛,王皓暖心喊“梁教授”,梁靖崑现为北京电影学院体育教研室副教授

梁靖崑发文总结世乒赛,王皓暖心喊“梁教授”,梁靖崑现为北京电影学院体育教研室副教授

大象新闻
2026-05-12 14:46:31
曝东契奇要求湖人留下里夫斯!詹姆斯去留棘手:骑勇很可能招揽他

曝东契奇要求湖人留下里夫斯!詹姆斯去留棘手:骑勇很可能招揽他

罗说NBA
2026-05-12 21:43:19
惊悚现场!飞机撞进居民楼!多人死伤,市长儿子当场殒命!太惨了

惊悚现场!飞机撞进居民楼!多人死伤,市长儿子当场殒命!太惨了

北国向锡安
2026-05-12 08:33:47
杜锋赛后爆雷人言论!名记:杜导这样说不合适,球迷:不要脸

杜锋赛后爆雷人言论!名记:杜导这样说不合适,球迷:不要脸

南海浪花
2026-05-13 06:37:42
这一次,被日本网友骂废物的张本智和,终究为父母的荒唐买了单

这一次,被日本网友骂废物的张本智和,终究为父母的荒唐买了单

阿讯说天下
2026-05-12 15:16:49
可惜了,不会演硬演,《主角》唯一败笔,换掉她这部剧近乎完美

可惜了,不会演硬演,《主角》唯一败笔,换掉她这部剧近乎完美

芬霏剧时光
2026-05-12 11:13:09
宣布了!正式离队!76人除掉最大麻烦

宣布了!正式离队!76人除掉最大麻烦

篮球实战宝典
2026-05-13 09:38:40
射程覆盖大半个中国!土耳其突然亮剑,这枚导弹让全球坐不住了

射程覆盖大半个中国!土耳其突然亮剑,这枚导弹让全球坐不住了

花寒弦絮
2026-05-11 09:12:59
男女同床裸睡差别大:男人图清凉,女人全是“心眼”!

男女同床裸睡差别大:男人图清凉,女人全是“心眼”!

阿凯销售场
2026-05-13 09:40:46
穿完礼服再退款后续:女子身份曝光,合唱团被牵连,商家准备起诉

穿完礼服再退款后续:女子身份曝光,合唱团被牵连,商家准备起诉

奇思妙想草叶君
2026-05-13 00:38:39
武汉大学终于硬气了,余思月真人曝光,她无缘继续留在OPPO公司

武汉大学终于硬气了,余思月真人曝光,她无缘继续留在OPPO公司

平老师666
2026-05-11 23:21:51
王思聪模仿者携一众时尚美女出席活动刷屏网络!本尊此前怒爆粗口

王思聪模仿者携一众时尚美女出席活动刷屏网络!本尊此前怒爆粗口

火山詩话
2026-05-13 06:47:41
重庆一大桥桥底崖壁现佛头雕塑?文旅部门回应

重庆一大桥桥底崖壁现佛头雕塑?文旅部门回应

新京报
2026-05-12 19:12:34
2026-05-13 10:11:00
Java精选
Java精选
一场永远也演不完的戏
1789文章数 3859关注度
往期回顾 全部

科技要闻

谷歌剧透安卓重大升级 Gemini深度集成底层

头条要闻

牛弹琴:印度的大麻烦来了 CNN的报道更是触目惊心

头条要闻

牛弹琴:印度的大麻烦来了 CNN的报道更是触目惊心

体育要闻

骑士终于玩明白了?

娱乐要闻

白鹿风波升级!掉粉20万评论区沦陷

财经要闻

深圳夫妻囤芯片,身家飙涨320亿

汽车要闻

吉利银河“TT”申报图曝光 电动尾翼+激光雷达

态度原创

教育
时尚
手机
健康
家居

教育要闻

西电就业,大变天!

没八卦、纯素人、不惊艳,可她赢麻了

手机要闻

曝华为鸿蒙HarmonyOS 6.1.0.120版本各个机型正逐步适配推送

干细胞能让人“返老还童”吗

家居要闻

极简主义下的居住场域与空间

无障碍浏览 进入关怀版