mysql 取整数_MySQL隐式转换的坑

本文详细介绍了MySQL中不同类型的数据在比较操作时的转换规则,包括NULL处理、字符串与数字比较、整数比较以及涉及Timestamp和Decimal的情况。强调了隐式类型转换可能导致的安全问题,如密码查询匹配错误,以及其对性能的影响。建议避免依赖隐式转换以减少潜在问题和提高效率。
摘要由CSDN通过智能技术生成

MySQL以以下规则描述比较操作如何进行转换:

cdebdeb1255b97316f0f20ff9cd472a0.png

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

实际使用中经研究发现字符串和数字比较时,优先把字符串转换为数字,当字符串不能转换为数字时,取前缀数字转换,没有前缀数字则是0

举例说明,数据如下表user

dcffd558f67771710300d13bb44ff6bd.png

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

57188fb116494af95ca8fc6ceba1f40a.png
密码被隐式转换

e9dc6a382fbc495d31c36cd50db5da30.png
警告信息

由于 MySQL 隐式类型转换规则比较复杂,依赖 MySQL 隐式转换很容易出现各种想像不到的问题,
而且 MySQL 隐式类型转换本身也是非常耗费 MySQL 服务器性能的,所以非常不推荐这样使用。

1bb59085e71fc4496a129f871a7447df.png

a847525a80afeea599414ee87a64a164.png

657232d60118b48bea27490af04f66cf.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值