mysql日期隐式转换_mysql中的隐式转换
什么隐式类型转换?
在MySQL中:
当操作符与不同类型的操作数一起使用时,会发生类型转换以使操作数兼容。则会发生转换隐式
也就是说,MySQL会根据需要自动将数字转换为字符串,将字符串转换数字。看到这个概念之后,是不是有一种茅塞顿开的感觉。哦... 原来在数据结构中telephone字段为字符串(varchar)类型,而我们传的手机号是数字类型。
案例一: 字符串转换为数字
mysql > SELECT 1+'1';
结果:
mysql > 2
案例二: 数字转换为字符串
mysql -> SELECT CONCAT(1024,' andyqian');
结果:
'1024andyqian';
此时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查询中,当查询条件左右两侧类型不匹配的时候会发生隐式转换,可能导致查询无法使用索引。下面分析两种隐式转换的情况
看表结构 phone为 int类型,name为 varchar
image
EXPLAIN select * from user where phone = '2'
EXPLAIN select * from user where phone = 2
两种情况都可以用到索引,这次等号右侧是'2',注意带单引号哟,左侧的索引字段是int类型,因此也会发生隐式转换,但因为int类型的数字只有2能转化为'2',是唯一确定的。所以虽然需要隐式转换,但不影响使用索引,不会导致慢查询
EXPLAIN select * from user where name= '2'
这种情况也能使用索引,因为他们本身就是varchar 类型
image
EXPLAIN select * from user where name= 2
因为等号两侧类型不一致,因此会发生隐式转换,cast(index_filed as signed),然后和2进行比较。因为'2',' 2','2a'都会转化成2,故MySQL无法使用索引只能进行全表扫描,造成了慢查询的产生。
image
小结
看到这里,是不是有一种,数据表设计还真不是件容易的事情。需要考虑的因素太多太多了,需要考虑字段类型,索引设计,还有各种约束条件等等。也一定要谨慎谨慎再谨慎!其实换个角度就更容易理解了,大家都知道高楼大厦都是需要一个好的地基的,在数据库表设计中,前期的表结构设计就是这个地基,其重要性可想而知。
mysql日期隐式转换_mysql中的隐式转换相关推荐
- mysql日期比较大小 方式_mysql中日期比较大小方法详解
在mysql中日期比较有许多的函数,下面我来给大家总结一下常用的mysql中日期比较大小有需要了解的朋友可进入参考参考,假如有个表product有个字段add_time,它的数据类型为datetime ...
- mysql 关闭隐式转换_Mysql中的隐式转换
在mysql查询中,当查询条件左右两侧类型不匹配的时候会发生隐式转换,可能导致查询无法使用索引,下面分析两种隐式转换的情况看表结构phone为int类型,name为varchar类型 EXPLAIN ...
- mysql日期转换成数字在线转换_MySQL中时间--gt;数字转换和IP地址--gt;数字转换(转) - - ITeye博客...
本文转载自: http://wangwei.cao.blog.163.com/blog/static/1023625262010063402377/ 后台有很字段都是采用时间戳的形式,二者如何转换 ...
- mysql php 时间比较大小_mysql中日期大小比较实例
假如有个表product有个字段add_time,它的数据类型为datetime,有人可能会这样写sql: select * from product where add_time = '2013-0 ...
- java 多态 显式隐式,Java 构造器中的显式参数和this隐式参数
1.构造器 写一个Java类,首先要先从构造器开始,构造器与类同名,在构造类的对象时会先从构造器开始. 构造器总是伴随着new操作符的执行而被调用. 构造器主要是用来初始化类的实例域. 构造器的特点: ...
- mysql gbk编码 字节数_MySql中UTF8和GBK编码中文字符长度问题
2.设计函数,输入为一个字符串,里边包含中文.英文.数字等字符,编码为GBK.中文字符的编码规则假定为:双字节组成,高字节大于0x80,低字节任意. a) 用常用语言(c/c++/php/ja ...
- mysql排他锁怎么用_MySQL 中的共享锁和排他锁的用法
在 MySQL 中的行级锁.表级锁和页级锁中,咱们介绍过,行级锁是 MySQL 中锁定粒度最细的一种锁,行级锁能大大减少数据库操作的冲突.行级锁分为共享锁和排他锁两种,本文将详细介绍共享锁和排他锁的概 ...
- mysql日期sql语句大全_mysql日期查找sql语句大全
经常会遇到这样的情况,本月阅读排行榜,本周排行榜等等.那么这样的sql怎么写呢,小班收集了一些这样的时间函数给大家参考,希望大家在自己网站项目中可以用的到 在mysql中对时间日期操作的函数有很多,有 ...
- mysql去除select换行符_MySQL中去除字段中的回车符和换行符
问题: 在使用[ load data infile 'D:/node.txt' into table node fields terminated by '\t'; ]语句批量导入如下图所示的aaa. ...
最新文章
- 【计算机网络】网络层 : 路由算法 ( 路由算法分类 | 静态路由算法 | 动态路由算法 | 全局性动态路由算法 | 分散性动态路由算法 | 分层次路由选择协议 )
- 全志 更换Update升级路径 Patch
- LeetCode 300. 最长上升子序列(Longest Increasing Subsequence)
- jedis操作redis(二)
- 【IfICan】脚步很乱!
- 新手学习python(四)字符串方法
- java 课后习题 随机整数最大值和最小值
- 记录——《C Primer Plus (第五版)》第九章编程练习第九题
- 安装cifs 访问windows的共享文件
- 《Python》 字典
- paip.c#图片裁剪
- 8086物理地址、汇编自增指令inc
- 如何搭建百度网盘目录搜索网站
- iOS不能显示英文音标问题
- 计算机实验PPT情景短剧,8.用计算机做科学实验.ppt
- vscode配置代理
- 当我跨过沉沦的一切,向着永恒开战的时候,你是我的军旗。——王小波
- 一.机器人概率学笔记_定位
- 09 matlab解方程
- 三部曲简史mobi_尤瓦尔简史三部曲:人类简史+未来简史+今日简史