前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >mysql隐式转化的坑

mysql隐式转化的坑

作者头像
灬沙师弟
发布2024-01-25 11:29:03
960
发布2024-01-25 11:29:03
举报
文章被收录于专栏:Java面试教程Java面试教程

前言:

了不起学弟:学长最近工作怎么样啊,有没有遇到什么问题,可以跟我们分享一下啊!

了不起:有,一个生产问题,我和你们来说道说道。

正文:

背景是这样的,项目里有一个报表,没有数据了。然后排查了一下,数据确实没有。

我们的数据流向是,业务库到数据处理库(通过存储过程),那问题就出现在了存储过程上。我去手动执行,执行的sql语句确实是报错了。

报错的问题:Truncated incorrect DOUBLE value:.......

这个报错的的意思是数据不匹配。

我的语句大概是 insert into select ......

我limit 1,然后用结果去生成insert 语句可以正常插入。那说明数据是没问题。比对了一下insert后, 和select出的字段类型是否匹配,也是没问题的。

那么问题可能就出现在select语句里。通过去缩小select字段的范围,缺人字段没什么问题,再通过一行行注释掉 innerjoin的语句,最终确定在有一条innerjoin语句的问题。

仔细端详了一下才发现,innerjoin on后面的两个字段的类型不一样。这才导致insert into select 报错。

那为什么select没问题,insert into select就会出现问题呢。

这就要涉及到mysql隐式转化了。

在普通的select语句中,我们select * from A inner join B on A.id=B.xid;

如果a.id是varchar,B.xid是int,那这样子的一条语句是可以去执行的,mysql会对其进行隐式转化,转化成功就不会报错。

如果是用在insert into select,再这个过程中,mysql需要讲select语句中的每一行映射到目标表相应列中,如果无法进行隐式转化,类型又不一样就会报错。

解决方案:使用cast函数、concat函数处理编程varchar类型,或者convert函数。所以当我们之后再写sql语句中,最好是养成一个良好的习惯,对于不同类型的条件,一定要去转化。虽然mysql是可以帮助我们去做这个自动转化的,但是不防出现一些特殊的情况,让你去忘记了有这么回事。就导致了这一次的生产问题。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-01-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java面试教程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言:
  • 正文:
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档