谈谈 MySQL 隐式类型转换
Posted lupingruanjian
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了谈谈 MySQL 隐式类型转换相关的知识,希望对你有一定的参考价值。
前言
今天我们继续回到mysql系列文章中,谈一谈MySQL中隐式类型转换。(其实我最早知道是在慢SQL优化中知道隐式类型转换概念的),在说隐式类型转换之前,首先我们通过一个实例来看看是怎么回事。
数据结构
本文中所有的操作,都是基于该数据结构(有兴趣的童鞋,可以实验):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
create table t_base_user(
oid bigint(20) not null primary key auto_increment,
name varchar(30) null comment "name",
email varchar(30) null comment "email",
age int null comment "age",
telephone varchar(30) null comment "telephone",
status tinyint(4) null comment "0 无效 1 有效",
created_at datetime null default now() comment "创建时间",
updated_at datetime null default now() comment "修改时间" )
### 新建索引alter table t_base_user add index idx_email(email);
alter table t_base_user add index idx_name(name);
alter table t_base_user add index idx_telephone(telephone);
### 新增记录:
INSERT INTO `andyqian`.`t_base_user` (`name`, `email`, `age`, `telephone`, `status`, `created_at`, `updated_at`)
VALUES (‘111111‘, ‘[email protected]‘, ‘111‘, ‘12345678901‘, ‘1‘, now(),now());
|
引子
首先我们基于上述数据结构中,我们来看看下面这个执行计划:
explain select * from t_base_user where telephone=12345678901;
细心的童鞋应该已经看出来了,为什么数据结构中已经在telephone字段上新建了idx_telephone索引,而上述语句并没有走索引,而是全表扫描。这是为什么呢?带着这疑问,我们来看看今天的主角——MySQL隐式类型转换
什么是隐式类型转换?
在MySQL中:
当操作符与不同类型的操作数一起使用时,会发生类型转换以使操作数兼容。则会发生转换隐式
也就是说,MySQL会根据需要自动将数字转换为字符串,将字符串转换数字。看到这个概念之后,是不是有一种茅塞顿开的感觉。哦… 原来在数据结构中telephone字段为字符串(varchar)类型,而我们传的手机号是数字类型。现在我们将SQL修改下:
select * from t_base_user where telephone=’12345678901′;
再看看上述语句的执行计划:
explain select * from t_base_user where telephone=’12345678901′;
从这里看,现在语句已经走索引了。为了加深我们对隐式类型转换的印象,我们再多看看几个隐式类型转换案例:
案例一: 字符串转换为数字
mysql > SELECT 1+’1′;
结果:
mysql > 2
案例二: 数字转换为字符串
mysql -> SELECT CONCAT(1024,’ andyqian’);
结果:
‘1024,’ andyqian’;
此时CONCAT(字符拼接)函数就将1024进行了隐式类型转换。
以上是关于谈谈 MySQL 隐式类型转换的主要内容,如果未能解决你的问题,请参考以下文章