服务热线
Service Hotline
4005-616-228
新闻中心
公司新闻
行业动态
IT知识
技术实力
服务质量
法律保障

谈谈 MySQL 隐式范例转换

发布时间:2019-06-19????阅读:193 |
分享到:

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)notnullprimary key auto_increment,

name varchar(30)nullcomment"name",

email varchar(30)nullcomment"email",

age intnullcomment"age",

telephone varchar(30)nullcomment"telephone",

status tinyint(4)nullcomment"0 无效 1 有用",

created_at datetime nulldefaultnow()comment"建设时刻",

updated_at datetime nulldefaultnow()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','andytohome@gmail.com','111','12345678901','1',now(),now());

引子

起首我们基于上述数据布局中,我们来看看下面这个执行打算:

explain select * from t_base_user where telephone=12345678901;

执行打算功效:

QQ截图20171214105031

仔细的童鞋应该已经看出来了,为什么数据布局中已经在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′;

功效:

QQ截图20171214105207

从这里看,此刻语句已经走索引了。为了加深我们对隐式范例转换的印象,我们再多看看几个隐式范例转换案例:

案例一: 字符串转换为数字

mysql > SELECT 1+’1′;

功效:

mysql > 2

案例二: 数字转换为字符串

mysql -> SELECT CONCAT(1024,’ andyqian’);

功效:

‘1024,’ andyqian’;

此时CONCAT(字符拼接)函数就将1024举办了隐式范例转换。

怎样停止隐式范例转换?

只有当清晰的知道隐式范例转换的法则,才气从基础上停止发生隐式范例转换。MySQL也在官网描写了举办隐式范例转换的一些法则如下:

1. 隐式范例转换法则:

假如一个或两个参数都是NULL,较量的功效是NULL,除了NULL安详的<=>相称较量运算符。对付NULL <=> NULL,功效为true。不必要转换

假如较量操纵中的两个参数都是字符串,则将它们作为字符串举办较量。

假如两个参数都是整数,则将它们作为整数举办较量。

假如不与数字举办较量,则将十六进制值视为二进制字符串

假如个中一个参数是十进制值,则较量取决于另一个参数。 假如另一个参数是十进制或整数值,则将参数与十进制值举办较量,假如另一个参数是浮点值,则将参数与浮点值举办较量

假如个中一个参数是TIMESTAMP或DATETIME列,黄金棋牌游戏,另一个参数是常量,则在执行较量之前将常量转换为时刻戳。

在全部其他环境下,参数都是作为浮点数(实数)较量的。

2. 行使CAST函数表现转换
我们可以行使CAST表现的将范例举办转换,如下所示:

mysql> SELECT 38.8, CAST(38.8 AS CHAR);

功效:

mysql > 38.8, ‘38.8’

如上述中:

select * from t_base_user where telephone=cast(12345678901 as char);

查察执行打算,我们也可以看出

QQ截图20171214105349

你看,这个时辰也走索引了。

收缩
  • 400-616-2280
  • 0531-88532317