mysql not in 转化_mysql 隐式转换问题(案例一)

建表语句:

CREATE TABLE `user` (

`id` varchar(255) NOT NULL,

`username` varchar(255) CHARACTER SET latin1 DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

表中数据:

cb986c1a943912e77fa45b6f45bfa34b.png

引入问题:

执行sql语句

SELECT id FROM `user` where id = 204027026112927605

结果按照预期的话应该是只有id等于204027026112927605 的一条数据,实际输出的结果为:

e5e2260c5cd80520a470252163adf084.png

分析:这里再where后面的条件查询处发生了隐式转换

逐行读取user表的id列放入val1,而常量204027026112927603存在于cache中,类型为double类型(2.0402702611292762E+17),所以到这里传值给val2后val2=2.0402702611292762E+17。

e337a5bfe346f42719c116001bcab006.png

当扫描到第一行时,204027026112927605转成doule的值为2.0402702611292762e17,等式成立,判定为符合条件的行,继续往下扫描,同理204027026112927603也同样符合

解决方法:(类型保持一致,避免出现隐式转换)

因为在定义表时id的类型为varchar类型,所以我们在条件处吧需要搜索的条件也赋成字符串类型,就可以避免隐式转换。

正确的sql:(用单引号讲id的值引起来)

SELECT id FROM `user` where id = '204027026112927605'

查询的结果:

d124277c1f6ff2d6f997a2822111fec5.png

结论:

避免发生隐式类型转换,隐式转换的类型主要有字段类型不一致、in参数包含多个类型、字符集类型或校对规则不一致等

隐式类型转换可能导致无法使用索引、查询结果不准确等,因此在使用时必须仔细甄别

数字类型的建议在字段定义时就定义为int或者bigint,表关联时关联字段必须保持类型、字符集、校对规则都一致

原文参考自知乎作者: 程序员引路人

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值