MySQL 隐式类型转换问题

项目中实际遇到问题

测试人员将数据库中bigint类型的数据手动改为0,导致字符串匹配此属性,全都匹配到为0的数据上,经查询发现为mysql的隐式类型转换的问题。

敲黑板的问题:

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

MySQL 的隐式类型转换原则:

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值