MySQL 隐式转换

  • A+
所属分类:MySQL

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;

结果如下:

MySQL 隐式转换

解释:

条件中的 0 为整数,MySQL 会将 name 的值自动转换为整数类型,进行比较,返回的结果是所有行。

avatar

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: