在项目中调用别的部门的模糊查询接口,发现还根据模糊字段搜索主键,还搜出了结果。SQL大概是这个意思Select * from tablea where name like "%1Test%" or id = '1Test'
,结果是查询到了数据,也就是数据库主键id为1的这条数据。后来发现这里是因为有MySQL的隐式类型转换导致能够查询到数据。
在MySQL中:
当操作符与不同类型的操作数一起使用时,会发生类型转换以使操作数兼容。则会发生转换隐式
也就是说,MySQL会根据需要自动将数字转换为字符串,将字符串转换数字。
mysql> SELECT 38.8, CAST(38.8 AS CHAR);
结果:
mysql > 38.8, ‘38.8’
这里说的类型一致,指的是在写SQL时,参数类型一定要与数据库中的类型一致,避免产生隐式类型转换,就如刚才在文首时,如果多检查,写的SQL的参数类型与数据库中字段类型一致,也就不会不走索引了
避免发生隐式类型转换,隐式转换的类型主要有字段类型不一致、in 参数包含多个类型、字符集类型或校对规则不一致等隐式类型转换可能导致无法使用索引、查询结果不准确等,因此在使用时必须仔细甄别数字类型的建议在字段定义时就定义为 int 或者 bigint,表关联时关联字段必须保持类型、字符集、校对规则都一致。
由于历史原因,需要兼容旧的设计,可以使用 MySQL 的类型转换函数 cast 和 convert,来明确的进行转换。