MySQL层比较函数的调用方式
这篇文章主要介绍“MySQL层比较函数的调用方式”,在日常操作中,相信很多人在MySQL层比较函数的调用方式问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MySQL层比较函数的调用方式”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
一、问题来源
最近遇到一个日期比较的问题如下:
root@localhost:test:10:25:48>selectfrom_unixtime(1596680255);+---------------------------+|from_unixtime(1596680255)|+---------------------------+|2020-08-0610:17:35|+---------------------------+1rowinset(0.00sec)root@localhost:test:10:25:52>selectfrom_unixtime(1596680255,'%Y-%m-%d')<'2020-08-1';+----------------------------------------------------+|from_unixtime(1596680255,'%Y-%m-%d')<'2020-08-1'|+----------------------------------------------------+|1|+----------------------------------------------------+1rowinset(2.70sec)root@localhost:test:10:25:59>selectfrom_unixtime(1596680255)<'2020-08-1';+-----------------------------------------+|from_unixtime(1596680255)<'2020-08-1'|+-----------------------------------------+|0|+-----------------------------------------+1rowinset(2.36sec)
按理来说from_unixtime(1596680255,’%Y-%m-%d’) < ‘2020-08-1’ 应该是false才对,但是返回为true,因此怀疑为字符串比较的方式
二、问题验证首先关闭gtid通过create table as 来验证一下字段类型如下:
createtabletestit951asselectfrom_unixtime(1596678161,'%Y-%m-%d')as"tt"createtabletestit952asselectfrom_unixtime(1596678161)as"tt"
通过这种方式发现两种建表字段为varchar和datetime类型。通过源码验证可以看到如下:
Breakpoint5,Arg_comparator::compare_string(this=0x7fffe40167c0)at/cdh/mysqldebug/percona-server-5.7.29-32/sql/item_cmpfunc.cc:16721672if((res1=(*a)->val_str(&value1)))(gdb)cContinuing.Breakpoint4,Arg_comparator::compare_datetime(this=0x7fffe40164c8)at/cdh/mysqldebug/percona-server-5.7.29-32/sql/item_cmpfunc.cc:15091509THD*thd=current_thd;(gdb)cContinuing.
可以看到内部通过了string和datetime两种类型来比较。因此得到证明。最后留下比较函数的位置:
Item_cmpfunc.cc
到此,关于“MySQL层比较函数的调用方式”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。