数据库为什么禁止使用属性隐式转换

数据库30条军规中有一条:

(25)禁止使用属性隐式转换

解读:SELECT uid FROM t_user WHERE phone=13812345678 会导致全表扫描,而不能命中phone索引,猜猜为什么?(这个线上问题不止出现过一次)

所谓猜猜为什么,那到底是为什么?

还有,mybatis 在dao层接口上入参int类型,赋给数据库varchar类型就算是产生属性隐式转换了么?

查询时候索引带入表达式、函数都会导致索引失效,隐式转换相当于将索引带入函数计算了,字符集的隐式转码也会导致索引失效而进行全表查询

禁用隐式转换为了规范数据,如果开启,未知类型数据转换为指定类型数据,有可能产生莫名其妙的错误,而且转换过程在数据库内部,不好排查。