- A+
MySQL 隐式转换的规则如下:
1. 两个参数至少有一个是 NULL 时,比较的结果也是 NULL,例外是使用 <=> 对两个 NULL 做比较时会返回1,这两种都不需要做类型转换。
2. 两个参数都是字符串,会按照字符串来做比较,不做类型转换。
3. 两个参数都是整数,按照整数来比较,不做类型转换。
4. 十六进制的值和非数字做对比时,会被当做二进制串。
5. 有一个参数是 TIMESTAMP 或者 DATETIME 时,并且另外一个参数是常量,常量会被转换为 TIMESTAMP。
6. 有一个参数是 decimal 类型,如果另外一个是 decimal 或者整数,会将整数转换为 decimal 后进行比较;如果另外一个参数浮点数,则会把 decimal 转换为浮点数进行比较。
7. 所有其他情况下,两个参数都会被转换为浮点数再进行比较。
问题描述
where 条件语句里,字段属性和赋给的条件,当数据类型不一样,这时候是没办法进行直接比较的,需要进行一致性转换。
默认的转换规则为:
不同类型全部都转换为浮点型
如果字段是字符,条件是整型,那么会把表中的字段全部转换为整型。
转换总结
字符转整型
1. 字符开头的一律为0
2. 数字开头的,直接截取到第一个不是字符的位置
时间类型转换
1. date 转 datetime 或者 timestamp
追加 00:00:00
2. date 转 time
无意义,直接为 00:00:00
3. datetime 或者 timestamp 转 date
直接截取 date 字段
4. datetime 或者 timestamp 转 time
直接截取 time 字段
5. time 转 datetime 或者 timestamp
按照字符串进行截取
6. time 和 datetime 转换为数字时,会变为双精度,加上ms(版本不同有区别)
案例分析
以如下表结构为例:
CREATE TABLE `user` ( `id` int(11) NOT NULL, `c1` int(11) NOT NULL, `name` varchar(100) NOT NULL DEFAULT 'fajlfjalfka', KEY `name` (`name`), KEY `id` (`id`) ) ENGINE=InnoDB
执行如下查询:
select * from user where name = 0;
结果如下:
解释:
条件中的 0 为整数,MySQL 会将 name 的值自动转换为整数类型,进行比较,返回的结果是所有行。