数据库MySQL基础入门之MySQL隐式转换
一、问题描述rootmysqldb 22:12: [xucl] show create table t1\G*************************** 1. row ***************************Table: t1Create Table: CREATE TABLE t1 (id varchar(255) DEFAULT NULL) ENGINEInnoDB DEFAULT CHARSETutf81 row in set (0.00 sec)rootmysqldb 22:19: [xucl] select * from t1;--------------------| id |--------------------| 204027026112927605 || 204027026112927603 || 2040270261129276 || 2040270261129275 || 100 || 101 |--------------------6 rows in set (0.00 sec)奇怪的现象rootmysqldb 22:19: [xucl] select * from t1 where id204027026112927603;--------------------| id |--------------------| 204027026112927605 || 204027026112927603 |--------------------2 rows in set (0.00 sec)640?wx_fmtjpeg什么鬼明明查的是204027026112927603为什么204027026112927605也出来了源码解释堆栈调用关系如下所示其中JOIN::exec()是执行的入口Arg_comparator::compare_real()是进行等值判断的函数其定义如下int Arg_comparator::compare_real(){/*Fix yet another manifestation of Bug#2338. Volatile will instructgcc to flush double values out of 80-bit Intel FPU registers beforeperforming the comparison.*/volatile double val1, val2;val1 (*a)-val_real();if (!(*a)-null_value){val2 (*b)-val_real();if (!(*b)-null_value){if (set_null)owner-null_value 0;if (val1 val2) return -1;if (val1 val2) return 0;return 1;}}if (set_null)owner-null_value 1;return -1;}比较步骤如下图所示逐行读取t1表的id列放入val1而常量204027026112927603存在于cache中类型为double类型2.0402702611292762E17所以到这里传值给val2后val22.0402702611292762E17。当扫描到第一行时204027026112927605转成doule的值为2.0402702611292762e17等式成立判定为符合条件的行继续往下扫描同理204027026112927603也同样符合如何检测string类型的数字转成doule类型是否溢出呢?这里经过测试当数字超过16位以后转成double类型就已经不准确了例如20402702611292711会表示成20402702611292712如图中val1MySQL string转成double的定义函数如下{char buf[DTOA_BUFF_SIZE];double res;DBUG_ASSERT(end ! NULL ((str ! NULL *end ! NULL) ||(str NULL *end NULL)) error ! NULL);res my_strtod_int(str, end, error, buf, sizeof(buf));return (*error 0) ? res : (res 0 ? -DBL_MAX : DBL_MAX);}真正转换函数my_strtod_int位置在dtoa.c太复杂了简单贴个注释吧/*strtod for IEEE--arithmetic machines.This strtod returns a nearest machine number to the input decimalstring (or sets errno to EOVERFLOW). Ties are broken by the IEEE round-evenrule.Inspired loosely by William D. Clingers paper How to Read FloatingPoint Numbers Accurately [Proc. ACM SIGPLAN 90, pp. 92-101].Modifications:1. We only require IEEE (not IEEE double-extended).2. We get by with floating-point arithmetic in a case thatClinger missed -- when were computing d * 10^nfor a small integer d and the integer n is not toomuch larger than 22 (the maximum integer k for whichwe can represent 10^k exactly), we may be able tocompute (d*10^k) * 10^(e-k) with just one roundoff.3. Rather than a bit-at-a-time adjustment of the binaryresult in the hard case, we use floating-pointarithmetic to determine the adjustment to withinone bit; only in really hard cases do we need tocompute a second residual.4. Because of 3., we dont need a large table of powers of 10for ten-to-e (just some small tables, e.g. of 10^kfor 0 k 22).*/既然是这样我们测试下没有溢出的案例rootmysqldb 23:30: [xucl] select * from t1 where id2040270261129276;------------------| id |------------------| 2040270261129276 |------------------1 row in set (0.00 sec)rootmysqldb 23:30: [xucl] select * from t1 where id101;------| id |------| 101 |------1 row in set (0.00 sec)结果符合预期而在本例中正确的写法应当是rootmysqldb 22:19: [xucl] select * from t1 where id204027026112927603;--------------------| id |--------------------| 204027026112927603 |--------------------1 row in set (0.01 sec)三、结论避免发生隐式类型转换隐式转换的类型主要有字段类型不一致、in参数包含多个类型、字符集类型或校对规则不一致等隐式类型转换可能导致无法使用索引、查询结果不准确等因此在使用时必须仔细甄别数字类型的建议在字段定义时就定义为int或者bigint表关联时关联字段必须保持类型、字符集、校对规则都一致文章来源网络 版权归原作者所有上文内容不用于商业目的如涉及知识产权问题请权利人联系小编我们将立即处理

相关新闻

API测试用例生成:人工写1天,AI 5分钟搞定?Taotoken平台实测3类方案的覆盖率陷阱

API测试用例生成:人工写1天,AI 5分钟搞定?Taotoken平台实测3类方案的覆盖率陷阱

AI时代测试用例生成的革命性实践:从人工到智能的完整转型指南 上周我在生产环境中直接部署了由GPT-5.4生成的测试用例,结果因漏测一个边界条件导致线上故障——这次教训促使我在Taotoken平台开展了为期两周的系统性对比实验,全面评估人工、模…

2026/11/5 3:43:58 阅读更多 →
本地AI对话系统搭建:Ollama+DeepSeek-R1+Streamlit实践

本地AI对话系统搭建:Ollama+DeepSeek-R1+Streamlit实践

1. 项目概述:本地AI对话系统的核心价值在AI技术爆发的当下,能够自主掌控的本地对话系统正成为开发者群体的新宠。这个基于OllamaDeepSeek-R1:7BStreamlit的技术方案,完美解决了云端服务的三大痛点:数据隐私性差、API调用成本高、功…

2026/10/30 8:20:16 阅读更多 →
护网行动前奏,新手如何快速掌握 Kali 核心工具用法

护网行动前奏,新手如何快速掌握 Kali 核心工具用法

快速构建你的攻防武器库在网络安全领域,尤其是面对护网行动或红蓝对抗这类高强度实战场景时,时间就是生命。对于刚入门的新手而言,最忌讳的不是技术不够深,而是面对庞大的工具集无从下手,或者在理论海洋中迷失方向。Ka…

2026/10/24 19:39:16 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/11/4 1:35:24 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/11/5 1:08:50 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/11/3 11:35:49 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/11/4 6:23:50 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/11/5 0:54:28 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/11/4 19:19:54 阅读更多 →

日新闻

周新闻

月新闻