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'

 

  查询的结果:

  

 

 

 

结论:

  1. 避免发生隐式类型转换,隐式转换的类型主要有字段类型不一致、in参数包含多个类型、字符集类型或校对规则不一致等
  2. 隐式类型转换可能导致无法使用索引、查询结果不准确等,因此在使用时必须仔细甄别
  3. 数字类型的建议在字段定义时就定义为int或者bigint,表关联时关联字段必须保持类型、字符集、校对规则都一致

 

 

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

 

posted @ 2020-03-22 16:00  Shawn_Michaels  阅读(505)  评论(0编辑  收藏  举报