在MySQL中执行SQL查询时,如果SQL语句中字段的数据类型和表中对应字段的数据类型不一致时,MySQL查询优化器会将数据的类型进行隐式转换。
以下面的数据为例,我根据
username
字段查询
user
表,得出如下结果:
SELECT * FROM `user` WHERE `username` = 0;
复制
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAjM2EzLcd3LcJzLcJzdllmVldWYtl2Pn5GcukzMlFjN5ITZ4gjZ3IWZmZzNxQDMjhTOkRjZ2gzNzUTMvwlN5EzM3ETOtUGall3LcVmdhNXLwRHdo9CXt92YucWbpRWdvx2Yx5yazF2Lc9CX6MHc0RHaiojIsJye.png)
显而易见,这不是我们想要的结果。表中
username
字段是
string
类型,而我们传入的是
int
类型,MySQL在执行这段SQL语句时,将
int
类型的
转换为了
double
类型
下表是MYySQL隐式类型转换规则:
输入类型 | 表字段类型 | 转换后的类型 |
---|---|---|
NULL | 任意类型 | NULL |
STRING | STRING | STRING |
INT | INT | INT |
INT | TIMESTAMP | TIMESTAMP |
INT | DATETIME | TIMESTAMP |
INT | DOUBLE | DOUBLE |
INT | STRING | DOUBLE |
任意类型 | DECIMAL | DECIMAL |
任意类型 | 十六进制 | 二进制 |