这篇文章主要介绍MySQL中隐式转换的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、问题描述
奇怪的现象:什么鬼,明明查的是204027026112927603,为什么204027026112927605也出来了二、源码解释堆栈调用关系如下所示:其中JOIN::exec()
是执行的入口,Arg_comparator::compare_real()
是进行等值判断的函数,其定义如下比较步骤如下图所示,逐行读取t1表的id列放入val1,而常量204027026112927603存在于cache中,类型为double类型(2.0402702611292762E+17),所以到这里传值给val2后val2=2.0402702611292762E+17。当扫描到第一行时,204027026112927605转成doule的值为2.0402702611292762e17,等式成立,判定为符合条件的行,继续往下扫描,同理204027026112927603也同样符合如何检测string类型的数字转成doule类型是否溢出呢?这里经过测试,当数字超过16位以后,转成double类型就已经不准确了,例如20402702611292711会表示成20402702611292712(如图中val1)真正转换函数my_strtod_int
位置在dtoa.c(太复杂了,简单贴个注释吧)既然是这样,我们测试下没有溢出的案例结果符合预期,而在本例中,正确的写法应当是三、结论避免发生隐式类型转换,隐式转开发云主机域名换的类型主要有字段类型不一致、in参数包含多个类型、字符集类型或校对规则不一致等隐式类型转换可能导致无法使用索引、查询结果不准确等,因此在使用时必须仔细甄别数字类型的建议在字段定义时就定义为int或者bigint,表关联时关联字段必须保持类型、字符集、校对规则都一致最后贴一下官网对于隐式类型转换的说明吧以上是“MySQL中隐式转换的示例分析”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注开发云行业资讯频道!
不知道大家之前对类似MySQL 5.7版本编译安装的详细教程的文章有无了解,今天我在这里给大家再简单的讲讲。感兴趣的话就一起来看看正文部分吧,相信看完MySQL 5.7版本编译安装的详细教程你一定会有所收获的。1、 Mysql概述:1.1、 Mysql概述My…
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。