首页 / MYSQL / MySQL 隐式转换
MySQL 隐式转换
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了MySQL 隐式转换,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3255字,纯文字阅读大概需要5分钟。
内容图文
![MySQL 隐式转换](/upload/InfoBanner/zyjiaocheng/861/5c0f41b602e14ada8aeecdc00e1ec173.jpg)
在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也在官网描述了进行隐式类型转换的一些规则如下:
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);查看执行计划,我们也可以看出
你看,这个时候也走索引了。
3. 类型一致
这里说的类型一致,指的是在写SQL时,参数类型一定要与数据库中的类型一致,避免产生隐式类型转换,就如刚才在文首时,如果多检查,写的SQL的参数类型与数据库中字段类型一致,也就不会不走索引了,你说是不是?小心隐式类型转换
这里再重申一次,写SQL时一定要检查参数类型与数据库字段类型一致,(如果参数不一致,也要使用CAST函数显示转换成一致)否则造成隐式类型转换,不走索引,后果简直不堪设想, 在前面《写会MySQL索引》这篇文章中提到过,不走索引,轻则造成慢查询,重则造成数据库服务器CPU100%。唉,说到这里,不瞒你说,我就吃过不少MySQL隐式类型转换的亏 ! (如慢查询) !
小结
看到这里,是不是有一种,数据表设计还真不是件容易的事情。需要考虑的因素太多太多了,需要考虑字段类型,索引设计,还有各种约束条件等等。也一定要谨慎谨慎再谨慎!其实换个角度就更容易理解了,大家都知道高楼大厦都是需要一个好的地基的,在数据库表设计中,前期的表结构设计就是这个地基,其重要性可想而知。
从后续开始,每篇MySQL文章最后,都推荐一个常用且实用的MySQL命令:
今天的命令是:
show full columns from table_name;作用: 显示指定表所有列信息
例如:
show full columns from t_base_user;返回结果如下图所示:
其中:
Field: 字段名
Type: 该字段类型
Collation: 描述了如何对查询出来的数据进行比较和排序
Null: 是否允许为空, NO: 不允许,YES 允许
Key: 键,例如: 主键(PRI), 唯一键(UNI) 等
Default: 该字段默认值 Extra: 附加信息如自增主键上的(auto_increment)
Privileges: 权限,有select,update等
Comment: 字段注释注意: 通过该命令显示都是建表时的信息,这里着重强调一下,在数据库建表时,在每个字段上, 一定要加注释,加注释,加注释!
最后: 大家今天剁手了吗? 祝大家晚安!
内容总结
以上是互联网集市为您收集整理的MySQL 隐式转换全部内容,希望文章能够帮你解决MySQL 隐式转换所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。