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;
表中数据:
引入问题:
执行sql语句
SELECT id FROM `user` where id = 204027026112927605
结果按照预期的话应该是只有id等于204027026112927605 的一条数据,实际输出的结果为:
分析:这里再where后面的条件查询处发生了隐式转换
逐行读取user表的id列放入val1,而常量204027026112927603存在于cache中,类型为double类型(2.0402702611292762E+17),所以到这里传值给val2后val2=2.0402702611292762E+17。
当扫描到第一行时,204027026112927605转成doule的值为2.0402702611292762e17,等式成立,判定为符合条件的行,继续往下扫描,同理204027026112927603也同样符合
解决方法:(类型保持一致,避免出现隐式转换)
因为在定义表时id的类型为varchar类型,所以我们在条件处吧需要搜索的条件也赋成字符串类型,就可以避免隐式转换。
正确的sql:(用单引号讲id的值引起来)
SELECT id FROM `user` where id = '204027026112927605'
查询的结果:
结论:
- 避免发生隐式类型转换,隐式转换的类型主要有字段类型不一致、in参数包含多个类型、字符集类型或校对规则不一致等
- 隐式类型转换可能导致无法使用索引、查询结果不准确等,因此在使用时必须仔细甄别
- 数字类型的建议在字段定义时就定义为int或者bigint,表关联时关联字段必须保持类型、字符集、校对规则都一致
原文参考自知乎作者: 程序员引路人