Mysql数据库主键为VERCHAR类型,但实体类为LONG类型,更新数据更新多条

经过mybatis-plus打印发现排除代码问题,将关键sql在数据库执行,发现数据库返回结果复现问题

查询sql

 数据库表主键定义

 

 

问题排查中,应与数据库long类型转换varcher类型后使用索引有关

 

更新:

sql如果where后的条件类型与表字段类型不一致,会隐式转换为float类型,转换后值会相同,用EXPLAIN分析sql会发现没有用到索引。

 

官方文档中关于隐式转化的规则是如下描述的:

  • 两个参数至少有一个是 NULL 时,比较的结果也是 NULL,例外是使用 <=> 对两个 NULL 做比较时会返回 1,这两种情况都不需要做类型转换
  • 两个参数都是字符串,会按照字符串来比较,不做类型转换
  • 两个参数都是整数,按照整数来比较,不做类型转换
  • 十六进制的值和非数字做比较时,会被当做二进制串
  • 有一个参数是 TIMESTAMP 或 DATETIME,并且另外一个参数是常量,常量会被转换为 timestamp
  • 有一个参数是 decimal 类型,如果另外一个参数是 decimal 或者整数,会将整数转换为 decimal 后进行比较,如果另外一个参数是浮点数,则会把 decimal 转换为浮点数进行比较
  • 所有其他情况下,两个参数都会被转换为浮点数再进行比较
posted @ 2021-12-28 18:04  osanai  阅读(508)  评论(0)    收藏  举报