mysql中比较函数_MySQL:MySQL层比较函数调用
---
###一、问题来源
最近遇到一个日期比较的问题如下:
```
root@localhost:test:10:25:48>select from_unixtime(1596680255);
+---------------------------+
| from_unixtime(1596680255) |
+---------------------------+
| 2020-08-06 10:17:35 |
+---------------------------+
1 row in set (0.00 sec)
root@localhost:test:10:25:52>select from_unixtime(1596680255,'%Y-%m-%d') < '2020-08-1';
+----------------------------------------------------+
| from_unixtime(1596680255,'%Y-%m-%d') < '2020-08-1' |
+----------------------------------------------------+
| 1 |
+----------------------------------------------------+
1 row in set (2.70 sec)
root@localhost:test:10:25:59>select from_unixtime(1596680255) < '2020-08-1';
+-----------------------------------------+
| from_unixtime(1596680255) < '2020-08-1' |
+-----------------------------------------+
| 0 |
+-----------------------------------------+
1 row in set (2.36 sec)
```
按理来说from_unixtime(1596680255,'%Y-%m-%d') < '2020-08-1' 应该是false才对,但是返回为true,因此怀疑为字符串比较的方式
###二、问题验证
首先关闭gtid通过create table as 来验证一下字段类型如下:
```
create table testit951
as
select from_unixtime(1596678161,'%Y-%m-%d') as "tt"
create table testit952
as
select from_unixtime(1596678161) as "tt"
```
通过这种方式发现两种建表字段为varchar和datetime类型。通过源码验证可以看到如下:
```
Breakpoint 5, Arg_comparator::compare_string (this=0x7fffe40167c0) at /cdh/mysqldebug/percona-server-5.7.29-32/sql/item_cmpfunc.cc:1672
1672 if ((res1= (*a)->val_str(&value1)))
(gdb) c
Continuing.
Breakpoint 4, Arg_comparator::compare_datetime (this=0x7fffe40164c8) at /cdh/mysqldebug/percona-server-5.7.29-32/sql/item_cmpfunc.cc:1509
1509 THD *thd= current_thd;
(gdb) c
Continuing.
```
可以看到内部通过了string和datetime两种类型来比较。因此得到证明。最后留下比较函数的位置:
Item_cmpfunc.cc
![image.png](https://upload-images.jianshu.io/upload_images/7398834-9a3fa87743742dad.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7728585/viewspace-2709839/,如需转载,请注明出处,否则将追究法律责任。
mysql中比较函数_MySQL:MySQL层比较函数调用相关推荐
- 在mysql中通配符_mysql查询中通配符的使用
mysql查询中通配符的使用 在mysql查询中经常会使用通配符,并且mysql的通配符和pgsql的存在区别(稍候再讨论),而且mysql中还可以使用正则表达式. SQL模式匹配: "_& ...
- mysql值比较函数_mysql 比较函数浅用
今天在操作数据库时,遇到一个问题:修改表中某条数据,比较某个字段原有值和修改值,如果原有值大于修改值,则这个字段不修改,从而引出了是用mysql的比较函数: 举个例子,我现在有一个users表,其中字 ...
- mysql中的%_mysql入门
MySQL 数据库 1 数据库概念(了解) 1.1 什么是数据库 数据库就是用来存储和管理数据的仓库! 数据库存储数据的优先: 可存储大量数据: 方便检索: 保持数据的一致性.完整性: 安全,可共享: ...
- mysql中主从_MySQL的主从
以下是个人实例操作得出的结论: mysql的主从同步是一个很成熟的架构: 优点: ①:在从服务器可以执行查询工作,降低主服务器压力(所谓的读写分离) ②:在从主服务器进行备份,避免备份期间影响主流服务 ...
- mysql中change用法,mysql 中alter的用法以及一些步骤
mysql 中alter的用法以及一些方法 在用到alter的时间,查到了这个文章,就copy下来了,详细进入下面链接: MySQL之alter语句用法总结 1:删除列 ALTER TABLE [表名 ...
- mysql中locat函数,MySQL中的LOCATE和POSITION函数使用方法 | 很文博客
不常用:MySQL中的LOCATE和POSITION函数 LOCATE(substr,str) POSITION(substr IN str) 返回子串 substr 在字符串 str 中第一次出现的 ...
- mysql 中 end like,MySQL 这三道必问面试题,你都会吗?
来源:JAVA面试精选 据群友面试反馈,整理了3道MySQL面试题,对很多人可能是小菜一碟,对这些熟悉,有更好的理解的话,可以留言补充,不断完善我们的题库. MySQL查询字段区不区分大小写? MyS ...
- mysql中使用正则表达式,mysql中使用正则表达式查询
基本形式 属性名 regexp '匹配方式' 正则表达式的模式字符 ^ 匹配字符开始的部分 eg1: 从info表name字段中查询以L开头的记录 select * from info where n ...
- mysql中加入正则表达式,mysql中的正则表达式搜索
mysql中的正则表达式搜索 语法: select * from table_name where column_name regexp '正则表达式' 或区分大小写 select * from ta ...
最新文章
- 常用的数据结构-链表
- Linux块设备概念和列出块设备命令学习
- 怎么在vue的@click里面直接写js_【转】为 Node.js 贡献你的力量 ———— 调试代码
- canvas笔记-closePath函数的使用(含例子)
- The Block披露员工持币情况,UNI等5个币种持有人数最多
- python爬虫预测_从爬虫到机器学习预测,我是如何一步一步做到的?
- mysql图形化界面MySQL_Workbench
- MiniProfiler使用点滴记录-2017年6月23日11:08:23
- 2022年我国城镇污水处理运营市场空间可达730亿元
- 从Linux服务器下载文件到本地命令
- oracle中todate函数实例,pl/sql to_date 函数使用实例讲解
- Word插入Latex公式的几种方式(TeXsWord、EqualX、Aurora等工具)
- mysql主从同步延迟优化大全
- 淘淘商城---8.11
- BP学习算法-构建三层神经网络
- html超链接并可以返回,返回到上一页的html代码的几种写法
- spreadjs~~一个Excel在线编辑的工具
- 关注公众号+加微信群,和大家一起畅聊技术
- 基于SVN的项目管理——集中与分散
- 《嵌入式Linux软硬件开发详解——基于S5PV210处理器》——2.5 WM8960音频编解码芯片...