在MySQL中。当我们对不同类型的值进行比较的时候,为了使得这些数值「可比较」(也可以称为类型的兼容性),MySQL会做一些隐式转化(Implicit type conversion)。那么什么是“隐式转换”呢?让我们一起来了解一下吧!

当我们对不同类型的值进行比较的时候,为了使得这些数值「可比较」(也可以称为类型的兼容性),MySQL会做一些隐式转化(Implicit type conversion)。比如下面的例子:

很明显,上面的SQL语句的执行过程中就出现了隐式转化。并且从结果们可以判断出,第一条SQL中,将字符串的“1”转换为数字1,而在第二条的SQL中,将数字2转换为字符串“2”。
MySQL也提供了CAST()函数。我们可以使用它明确的把数值转换为字符串。当使用CONCA()函数的时候,也可能会出现隐式转化,因为它希望的参数为字符串形式,但是如果我们传递的不是字符串呢:

隐式转化规则

官方文档中关于隐式转化的规则是如下描述的:

翻译为中文就是:

  • 1.两个参数至少有一个是 NULL 时,比较的结果也是 NULL,例外是使用 <=> 对两个 NULL 做比较时会返回 1,这两种情况都不需要做类型转换
  • 2.两个参数都是字符串,会按照字符串来比较,不做类型转换
  • 3.两个参数都是整数,按照整数来比较,不做类型转换
  • 4.十六进制的值和非数字做比较时,会被当做二进制串
  • 5.有一个参数是 TIMESTAMP 或 DATETIME,并且另外一个参数是常量,常量会被转换为 timestamp
  • 6.有一个参数是 decimal 类型,如果另外一个参数是 decimal 或者整数,会将整数转换为 decimal 后进行比较,如果另外一个参数是浮点数,则会把 decimal 转换为浮点数进行比较
  • 7.所有其他情况下,两个参数都会被转换为浮点数再进行比较

注意点

安全问题:假如 password 类型为字符串,查询条件为 int 0 则会匹配上。

相信上面的例子,一些机灵的同学可以发现其实上面的例子也可以做sql注入。
假设网站的登录那块做的比较挫,使用下面的方式:

如果username输入的是a' OR 1='1,那么password随便输入,这样就生成了下面的查询:

就有可能登录系统。其实如果攻击者看过了这篇文章,那么就可以利用隐式转化来进行登录了。如下:

之所以出现上述的原因是因为:

下面通过一些例子来复习一下上面的转换规则:

把字符串“aa”和1进行求和,得到1,因为“aa”和数字1的类型不同,MySQL官方文档告诉我们:
查看warnings可以看到隐式转化把字符串转为了double类型。但是因为字符串是非数字型的,所以就会被转换为0,因此最终计算的是0+1=1
上面的例子是类型不同,所以出现了隐式转化,那么如果我们使用相同类型的值进行运算呢?

之所以出现这种情况,是因为 “+” 为算术操作符arithmetic operator 这样就可以解释为什么a和b都转换为double了。因为转换之后其实就是:0+0=0了。
在看一个例子:

现在就看也很好的理解上面的例子了吧。a+b=c结果为1,1在MySQL中可以理解为TRUE,因为'a'+'b'的结果为0,c也会隐式转化为0,因此比较其实是:0=0也就是true,也就是1.
第二个需要注意点就是防止多查询或者删除数据

上面的例子本意是查询id为5的那一条记录,结果把id为6的那一条也查询出来了。我想说明什么情况呢?有时候我们的数据库表中的一些列是varchar类型,但是存储的值为‘1123’这种的纯数字的字符串值,一些同学写sql的时候又不习惯加引号。这样当进行select,update或者delete的时候就可能会多操作一些数据。所以应该加引号的地方别忘记了。
关于字符串转数字的一些说明

从上面的例子可以看出,当把字符串转为数字的时候,其实是从左边开始处理的。

  • 1.如果字符串的第一个字符就是非数字的字符,那么转换为数字就是0
  • 2.如果字符串以数字开头
  • (1)如果字符串中都是数字,那么转换为数字就是整个字符串对应的数字
  • (2)如果字符串中存在非数字,那么转换为的数字就是开头的那些数字对应的值

了解MySQL的隐式转化相关推荐

  1. MySQL隐式转化整理

    MySQL隐式转化整理 原文:http://www.cnblogs.com/rollenholt/p/5442825.html 前几天在微博上看到一篇文章:价值百万的 MySQL 的隐式类型转换感觉写 ...

  2. MySQL 的隐式转换

    当我们对不同类型的值进行比较的时候,为了使得这些数值可比较(也可以称为类型的兼容性),MySQL 会做一些隐式转换(Implicit type conversion): 若字符串是以数字开头,并且全部 ...

  3. 类型转换:隐式转化(算数转换,整型提升,混合提升,赋值转换),强制转换【C语言】

    类型转换 隐式转化 算数转换 整型提升 混合提升 赋值转换 强制转换 编译器使用注意 小结 类型转换 隐式转化 不需要人为参与而产生的默认转称为隐式转化. 隐式转化,是计算机语言实现层面最难的,指针是 ...

  4. 【MaxCompute学习】隐式转化的问题

    有一次计算一个数据的百分比,想把小数结果取2位,并拼接一个百分号展示在结果报表中.用到的sql如下 select concat(round(10230/1497409,4)*100,'%') from ...

  5. MySQL的隐式类型转换

    引入 在项目中调用别的部门的模糊查询接口,发现还根据模糊字段搜索主键,还搜出了结果.SQL大概是这个意思Select * from tablea where name like "%1Tes ...

  6. mysql 注入关键字waf_利用mysql的隐式类型转换绕过waf注入

    今天做的一道ctf题,要求绕过waf去注入,可以通过mysql隐式类型转换的特性去绕过waf,在这里记录下来供大家学习一下 题目地址:题目地址(比赛结束后可能会失效) HINT:我都过滤了,看你怎么绕 ...

  7. hadoop cdh5的pig隐式转化(int到betyarray)不行了

    cdh3上,pig支持int到chararray的隐式转化,但到cdh5不行. pig code is as follows: %default Cleaned_Log /user/usergroup ...

  8. mysql数据库隐式表_详解MySQL数据库常见的索引问题:无索引,隐式转换,附实例说明...

    概述 在这些年的工作之中,由于SQL问题导致的数据库故障层出不穷,而索引问题是SQL问题中出现频率最高的,常见的索引问题包括:无索引,隐式转换. 索引问题 1.无索引 当数据库中出现访问表的SQL无索 ...

  9. 学习valueOf和toString,理解隐式转化规则

    js在比较运算过程中经常会发生隐式转换,常常会给人意料外的结果,而隐式转换在面试过程中又经常会被考到,所以打算好好整理一下隐式转换这个知识点,本文算是个人对隐式转换的学习梳理. 1.toString和 ...

  10. 《MySQL tips:隐式类型转换与隐式字符编码转换对查询效率的影响》

    维护一个交易系统,交易记录表tradelog包含交易流水号(tradeid).交易员id(operator).交易时间(t_modified)等字段. create table 'tradelog' ...

最新文章

  1. 如何优雅的设计java异常
  2. Oracle表数据恢复
  3. ECharts 实现人民的名义关系图谱 代码开源
  4. RabbitMQ事务和Confirm发送方消息确认——深入解读
  5. 2020idea插件怎么同步_VScode 插件整理
  6. 在开启bin-log日志下Mysql报错
  7. 程序员不会SQL?骨灰级工程师:全等着被淘汰吧!这是必会技能!
  8. MPLS virtual private network OptionA实验(华为设备)
  9. 修改初始Manager QuerySets,重写Manager.get_query_set()函数之后,发现并没有按照我们指定的方法执行。...
  10. MyBatis Generator作为maven插件自动生成增删改查代码及配置文件例子
  11. 18.海量分布式存储系统 Doris 的高可用架构设计分析
  12. linux搭建.net开发环境,ASP.NET Core知多少(5): Linux上搭建.Net Core开发环境
  13. matlab xticklabel 旋转,在Matlab中,如何实现xticklabel的旋转?转
  14. sed 替换文件中的字符串
  15. linux 进程间界面嵌套,WPF 同一窗口内的多线程/多进程 UI(使用 SetParent 嵌入另一个窗口)...
  16. HTML5——HTML5元素周期表
  17. Psins代码解析之test_SINS_east_west.mtest_SINS_north_south.m
  18. 模拟电子技术基础实验6.5
  19. 运维人必须掌握的 5 种常用运维监控工具
  20. 借助向 Dev Channel 內部人員提供的最新預覽版本,Microsoft 已將舊版本地管理員密碼解決方案(也稱為 LAPS)直接集成到 Windows 11 中

热门文章

  1. C.Fountains(Playrix Codescapes Cup (Codeforces Round #413, rated, Div. 1 + Div. 2)+线段树+RMQ)...
  2. 二叉树前中后/层次遍历的递归与非递归形式(c++)
  3. 51nod 1218 最长递增子序列 V2(dp + 思维)
  4. angularJS使用rootscope创建父域和子模态框通用的属性与函数
  5. 416. Partition Equal Subset Sum
  6. Oracle开发:常用的数据库字段类型[转]
  7. 数据库热备之SQLServer的数据库镜像实施笔记
  8. 自定义tableView的section header/footerView时的view复用问题
  9. M1支持 Accusonus ERA Bundle for mac(音频降噪消除去混音插件包)
  10. iOS底层探索之Runtime(三): lookUpImpOrForward慢速查找分析