避免隐式类型转换

    当 SQL 中谓词两侧的数据类型不一致时,TiDB 将隐式地将一侧或两侧的数据类型进行转换,将其变为兼容的数据类型,以进行谓词运算。

    TiDB 中隐式类型转换规则如下:

    • 如果一个或两个参数都是 NULL,比较的结果是 NULL(NULL 安全的 相等比较运算符除外,对于 NULL <=> NULL,结果为 true,不需要转换)。
    • 如果比较操作中的两个参数都是字符串,则将它们作为字符串进行比较。
    • 如果两个参数都是整数,则将它们作为整数进行比较。
    • 如果其中一个参数是十进制值,则比较取决于另一个参数。如果另一个参数是十进制或整数值,则将参数与十进制值进行比较,如果另一个参数是浮点值,则将参数与浮点值进行比较。
    • 如果其中一个参数是 TIMESTAMP 或 DATETIME 列,另一个参数是常量,则在执行比较之前将常量转换为时间戳。
    • 在所有其他情况下,参数都是作为浮点数(DOUBLE 类型)比较的。

    隐式类型转换引起的后果

    • 精度丢失

    如下案例,account_id 为主键,其数据类型为 。通过执行计划可见,该 SQL 发生了隐式类型转换,无法使用索引。

    运行结果简述:从以上执行计划中,可见 Cast 算子。

    精度丢失

    运行结果简述:从以上执行计划中,可见 Cast 算子。

    运行结果简述:以上执行出现了错误结果。