Mysql隐式类型转换方式

 更新时间:2024年04月03日 11:25:34   作者:码农弓长先生  
这篇文章主要介绍了Mysql隐式类型转换方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

脚本之家 / 编程助手:解决程序员“几乎”所有问题!
脚本之家官方知识库 → 点击立即使用

一、实例操作

如下图user表结构

查询语句1

  • 执行结果:

查询语句2

  • 执行结果:

查询语句3

  • 执行结果:

查询语句4

  • 执行结果:

  • 结果分析:

从上面四则查询语句中可以看出 mobile的字段为字符类型时,当查询时等式是字符类型和数字类型时执行结果不一致,而status的字段为数字类型,当查询时等式是字符类型和数字类型时执行结果一致。

这是为什么呢?

二、mysql 隐式类型转换

上述案例其真实的原因时mysql的隐式类型转换,那什么是隐式类型转换呢?

1. 隐式类型转换规则

官方文档

  • 如果一个或两个参数均为NULL,则比较的结果为NULL,除了 相等比较运算符。对于NULL NULL,结果为true。
  • 如果比较操作中的两个参数都是字符串,则将它们作为字符串进行比较。
  • 如果两个参数都是整数,则将它们作为整数进行比较。
  • 如果不与数字比较,则将十六进制值视为二进制字符串。
  • 如果参数之一是 timestamp 或 datatime column,而另一个参数是常量,则在执行比较之前,该常量将转换为时间戳。
  • 如果参数之一是十进制值,则比较取决于另一个参数。如果另一个参数是十进制或整数值,则将参数作为十进制值进行比较;如果另一个参数是浮点值,则将参数作为浮点值进行比较。
  • 在所有其他情况下,将参数作为浮点数(实数)进行比较。例如,将字符串和数字操作数进行比较,将其作为浮点数的比较。

通过隐式类型转换可以得出上述示例的结果:当查询中有数字时那么会将字符串转化成数字进行比较。

所以当你的列为字符串时那么需要将列中字符串进行类型格式转换而进行字符格式转换之后则与索引不一致;

当你的列为数字时查询等式为字符串时只是把查询的常量转成数字并不影响列的类型所以依然可以使用索引并没有破坏索引的类型。

2. 隐式类型转换实例

3. 避免隐式类型转换

可以使用内置函数对类型强制性转换

  • case( value as type)
  • conver(value,type)

我们需要充分了解吗MySQL里隐式类型转换的规则,同时我们日常在写SQL时一定要检查参数类型与数据库字段类型是否一致,否则可能造成隐式类型转换,不能正常应用索引,造成慢查询,甚至拖垮整个数据库服务集群。

如果参数不一致,也可以考虑使用CAST函数显性转换成一致类型。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

蓄力AI

微信公众号搜索 “ 脚本之家 ” ,选择关注

程序猿的那些事、送书等活动等着你

原文链接:https://blog.csdn.net/weixin_64940494/article/details/126115774

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 reterry123@163.com 进行投诉反馈,一经查实,立即处理!

相关文章

  • CentOS7 通过YUM安装MySQL5.7的步骤详解

    CentOS7 通过YUM安装MySQL5.7的步骤详解

    这篇文章主要介绍了CentOS7 通过YUM安装MySQL5.7的步骤详解,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-01-01
  • 数据库连接池以及sequelize实现增删改查等操作指南

    数据库连接池以及sequelize实现增删改查等操作指南

    Sequelize的连接需要传入参数,并且可以配置开启线程池、读写分库等操作,下面这篇文章主要给大家介绍了关于数据库连接池以及sequelize实现增删改查等操作的相关资料,需要的朋友可以参考下
    2022-08-08
  • MySQL中的行级锁、表级锁、页级锁

    MySQL中的行级锁、表级锁、页级锁

    这篇文章主要介绍了MySQL中的行级锁、表级锁、页级锁,以及分享了多种避免死锁的方法,感兴趣的小伙伴们可以参考一下
    2016-01-01
  • mysql 判断是否为子集的方法步骤

    mysql 判断是否为子集的方法步骤

    这篇文章主要介绍了mysql 判断是否为子集的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • 详解mysql的备份与恢复

    详解mysql的备份与恢复

    这篇文章主要介绍了mysql的备份与恢复的相关资料,帮助大家更好的理解和学习mysql,感兴趣的朋友可以了解下
    2020-08-08
  • MySQL约束和表的复杂查询操作大全

    MySQL约束和表的复杂查询操作大全

    约束是关系型数据库的一个重要功能, 添加到库中的数据需要保证其的正确性; 约束, 就是让数据库帮助程序员更好的检查数据是否正确.,这篇文章主要介绍了MySQL约束和表的复杂查询操作,需要的朋友可以参考下
    2022-11-11
  • mysql中json_extract的具体使用

    mysql中json_extract的具体使用

    mysql5.7版本开始支持JSON类型字段,本文主要介绍了mysql中json_extract的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-05-05
  • Linux MYSQL5.7.23 rpm安装(附带安装包)教程

    Linux MYSQL5.7.23 rpm安装(附带安装包)教程

    RPM是一种软件包管理系统,常用于基于Red Hat的Linux发行版,如Fedora和CentOS,它允许用户通过预编译的二进制包快速安装和管理软件,这篇文章给大家介绍Linux mysql5.7.23 rpm安装(附带安装包)教程,感兴趣的朋友一起看看吧
    2023-12-12
  • Mysql中count带条件计数实例代码

    Mysql中count带条件计数实例代码

    这篇文章主要给大家介绍了关于Mysql中count带条件计数的相关资料,Mysql中count()函数的一般用法是统计字段非空的记录数,所以可以利用这个特点来进行条件统计,需要的朋友可以参考下
    2023-09-09
  • MySql安装步骤图文教程及中文乱码的解决方案

    MySql安装步骤图文教程及中文乱码的解决方案

    这篇文章主要介绍了MySql安装步骤图文教程及中文乱码的解决方案,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-08-08

最新评论