什么隐式类型转换?

在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中的隐式转换相关推荐

  1. mysql日期比较大小 方式_mysql中日期比较大小方法详解

    在mysql中日期比较有许多的函数,下面我来给大家总结一下常用的mysql中日期比较大小有需要了解的朋友可进入参考参考,假如有个表product有个字段add_time,它的数据类型为datetime ...

  2. mysql 关闭隐式转换_Mysql中的隐式转换

    在mysql查询中,当查询条件左右两侧类型不匹配的时候会发生隐式转换,可能导致查询无法使用索引,下面分析两种隐式转换的情况看表结构phone为int类型,name为varchar类型 EXPLAIN ...

  3. mysql日期转换成数字在线转换_MySQL中时间--gt;数字转换和IP地址--gt;数字转换(转) - - ITeye博客...

    本文转载自:   http://wangwei.cao.blog.163.com/blog/static/1023625262010063402377/ 后台有很字段都是采用时间戳的形式,二者如何转换 ...

  4. mysql php 时间比较大小_mysql中日期大小比较实例

    假如有个表product有个字段add_time,它的数据类型为datetime,有人可能会这样写sql: select * from product where add_time = '2013-0 ...

  5. java 多态 显式隐式,Java 构造器中的显式参数和this隐式参数

    1.构造器 写一个Java类,首先要先从构造器开始,构造器与类同名,在构造类的对象时会先从构造器开始. 构造器总是伴随着new操作符的执行而被调用. 构造器主要是用来初始化类的实例域. 构造器的特点: ...

  6. mysql gbk编码 字节数_MySql中UTF8和GBK编码中文字符长度问题

    2.设计函数,输入为一个字符串,里边包含中文.英文.数字等字符,编码为GBK.中文字符的编码规则假定为:双字节组成,高字节大于0x80,低字节任意.     a) 用常用语言(c/c++/php/ja ...

  7. mysql排他锁怎么用_MySQL 中的共享锁和排他锁的用法

    在 MySQL 中的行级锁.表级锁和页级锁中,咱们介绍过,行级锁是 MySQL 中锁定粒度最细的一种锁,行级锁能大大减少数据库操作的冲突.行级锁分为共享锁和排他锁两种,本文将详细介绍共享锁和排他锁的概 ...

  8. mysql日期sql语句大全_mysql日期查找sql语句大全

    经常会遇到这样的情况,本月阅读排行榜,本周排行榜等等.那么这样的sql怎么写呢,小班收集了一些这样的时间函数给大家参考,希望大家在自己网站项目中可以用的到 在mysql中对时间日期操作的函数有很多,有 ...

  9. mysql去除select换行符_MySQL中去除字段中的回车符和换行符

    问题: 在使用[ load data infile 'D:/node.txt' into table node fields terminated by '\t'; ]语句批量导入如下图所示的aaa. ...

最新文章

  1. 【计算机网络】网络层 : 路由算法 ( 路由算法分类 | 静态路由算法 | 动态路由算法 | 全局性动态路由算法 | 分散性动态路由算法 | 分层次路由选择协议 )
  2. 全志 更换Update升级路径 Patch
  3. LeetCode 300. 最长上升子序列(Longest Increasing Subsequence)
  4. jedis操作redis(二)
  5. 【IfICan】脚步很乱!
  6. 新手学习python(四)字符串方法
  7. java 课后习题 随机整数最大值和最小值
  8. 记录——《C Primer Plus (第五版)》第九章编程练习第九题
  9. 安装cifs 访问windows的共享文件
  10. 《Python》 字典
  11. paip.c#图片裁剪
  12. 8086物理地址、汇编自增指令inc
  13. 如何搭建百度网盘目录搜索网站
  14. iOS不能显示英文音标问题
  15. 计算机实验PPT情景短剧,8.用计算机做科学实验.ppt
  16. vscode配置代理
  17. 当我跨过沉沦的一切,向着永恒开战的时候,你是我的军旗。——王小波
  18. 一.机器人概率学笔记_定位
  19. 09 matlab解方程
  20. 三部曲简史mobi_尤瓦尔简史三部曲:人类简史+未来简史+今日简史

热门文章

  1. java计算机毕业设计影视论坛源码+数据库+系统+lw文档+部署
  2. 【数据库】MySQL奇淫技巧(基础篇)
  3. MATLAB朴素贝叶斯(德国信用卡案例)
  4. 软件开发的哲学思考(转)
  5. 动手学MFC之八——鼠标和键盘
  6. Robotstudio教程之示教编程与仿真运行
  7. 基于微信云开发的微信小程序之搜索功能的实现
  8. visual-studio-code – 如何更改VS Code的文件排序?
  9. 配置OpenSIPS速记
  10. 网络层ICMP和ARP协议介绍