# 隐式数据类型转换案例学习背景

![left](./student-guide/diagram/01-12-1.png)

+ 语句与执行计划：

------------------------------------------------------------
当我们在数据库中对不同数据类型进行运算时(比如 where 子句过滤 a=1 或者表连接 a.id=b.id)，为了操作兼容，数据库会对相关类型进行隐式数据类型转换。我们通过例子，介绍下隐式类型转换带来的问题。

具体案例

我们有这样一张表：

```
CREATE TABLE t3 (
 id int(11) NOT NULL AUTO_INCREMENT,
 k varchar(10) NOT NULL DEFAULT '0',
 c char(120) NOT NULL DEFAULT '',
 pad char(60) NOT NULL DEFAULT '',
 PRIMARY KEY (id) ,
 KEY k_2 (k)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin AUTO_INCREMENT=1629882;
```

其中字段 k 是 varchar 类型，并且 k 上有普通索引 k_2，我们来看下下面的一个"普通"的 SQL 以及执行计划：

（略）

我们看到 k 字段有索引情况下，这里却走了 TableFullScan 算子，进行了全表扫描！这里问题出在哪里了呢？问题就在等值查询的 where 字句 k=1 上，这里等值运算符(=)两边的数据 k 为 varchar， 而 1 是数值类型，类型不一致，然后我们再看 explain 的 operator info 信息，优化器对 sbtest.k3.k 字段进行了 cast 函数转换，转换为了数值类型 double，索引字段上使用了函数运算，自然就没法使用 k 字段上的索引 k_2 了，然后执行计划就走了全表扫描。
