MySQL隐式类型转换

这篇具有很好参考价值的文章主要介绍了MySQL隐式类型转换。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

当运算符与不同类型的操作数一起使用时,会发生类型转换以使操作数兼容。有些转换是隐式发生的。例如,MySQL会根据需要自动将字符串转换为数字,反之亦然。
MySQL隐式类型转换
MySQL隐式类型转换

转换规则

  1. 如果一个或两个参数都为NULL,则比较结果为NULL 。但是相等比较运算符<=>除外,对于NULL<=>NULL,结果为1,不需要转换。

  2. 如果比较操作中的两个参数都是字符串,则将它们作为字符串进行比较,不做类型转换。

  3. 如果两个参数都是整数,则将它们作为整数进行比较,不做类型转换。

  4. 十六进制的值和非数字做比较时,会被当做二进制串。

  5. 如果其中一个参数是TIMESTAMP或DATETIME列,而另一个参数为常量,则在执行比较之前,该常量将转换为时间戳。这样做是为了对ODBC更加友好。对于IN( ) 的参数,并没有这样做。为了安全起见,在进行比较时,请始终使用完整的日期时间、日期或时间字符串。例如,为了在将BETWEEN与日期或时间值一起使用时获得最佳结果。

  6. 来自一个或多个表的单行子查询不被视为常量。例如,如果子查询返回一个要与DATETIME 值进行比较的整数,则比较将作为两个整数进行。整数不会转换为时间值。要将操作数作为 DATETIME值进行比较,请使用 CAST()将子查询值显式转换为DATETIME。

  7. 如果其中一个参数是十进制值,则比较取决于另一个参数。如果另一个参数是十进制或整数值,则将参数作为十进制值进行比较;如果另一参数是浮点值,则将其作为浮点值进行比较。

  8. 在所有其他情况下,参数将作为浮点(双精度)数字进行比较。例如,字符串和数字操作数的比较是作为浮点数的比较进行的。

带来的问题

1. 精度丢失导致查询结果错误

MySQL隐式类型转换

MySQL隐式类型转换

浮点数和整数类型的大值的比较是近似的,因为整数在比较之前被转换为双精度浮点数,不能准确表示所有 64 位整数。
例如,整数值 253 + 1 不能表示为浮点数,在进行浮点数比较之前四舍五入为 253 或 253 + 2,具体取决于CPU。

MySQL隐式类型转换

字符串和数字对比都会转化成double,varchar或 bigint 超过16位转化成 double时会出现精度丢失。

2. 参数类型和字段类型不一致时导致索引失效

MySQL隐式类型转换
当字段类型为字符串时参数类型为整数类型,导致索引失效
MySQL隐式类型转换

我们需要充分了解MySQL里隐式类型转换的规则,同时日常在写SQL时一定要检查参数类型与数据库字段类型是否一致,否则可能造成隐式类型转换,不能正常应用索引。文章来源地址https://www.toymoban.com/news/detail-422839.html

到了这里,关于MySQL隐式类型转换的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++的类型转换运算符:dynamic_cast

    顾名思义,与静态类型转换相反,动态类型转换在运行阶段(即应用程序运行时)执行类型转换。 可检查 dynamic_cast 操作的结果,以判断类型转换是否成功。使用 dynamic_cast 运算符的典型语法如下: 例如: 如上述代码所示,给定一个指向基类对象的指针,程序员可使用 dyna

    2024年02月15日
    浏览(32)
  • Python学习笔记(2)--字面量,注释,变量,数据类型,数据类型转换,标识符,运算符

    传送门==B站黑马python入门教程 1.字面量 字面量 : 代码中被固定写的值 python常用的6种数据类型为 数字,字符串,列表,元组,集合,字典 目前基础部分学习 字符串,整数,浮点数 即可 字符串 :(文本),由任意数量的 字符 (示例:中文/英文/各类符号/数组)组成; 在 python 中,字符串需要用双

    2024年02月11日
    浏览(46)
  • C++ operator关键字的使用(重载运算符、仿函数、类型转换操作符)

    C++ operator的使用(重载运算符、仿函数、类型转换操作符) C++11实用技术(一)auto与decltype的使用 C++11实用技术(二)std::function和bind绑定器 C++11实用技术(三)std::future、std::promise、std::packaged_task、async C++11 中,operator 是一个,用于重载运算符。通过重载运算符

    2024年02月14日
    浏览(37)
  • 【m_listCtrl !=NULL有多个运算符与操作数匹配】2023/9/21 上午11:03:44

    2023/9/21 上午11:03:44 m_listCtrl !=NULL有多个运算符与操作数匹配 2023/9/21 上午11:04:00 如果您在编译或运行代码时遇到\\\"M_listCtrl != NULL有多个运算符与操作数匹配\\\"的错误提示,这通常是由于以下几个原因之一: 错误使用运算符:在条件判断语句中,应该使用双等号(==)进行相等性比

    2024年02月07日
    浏览(38)
  • 把你的 Python 技能从 “Hello World“ 升级到 “万能钥匙“:掌握 Python 的输出、输入、数据类型转换和运算符!

    这篇文章我将为大家分享 python 的输出、输入、数据类型的转换和运算符 相关的知识。如果大家也想跟着博主一起学习 python ,欢迎订阅专栏哦python学习😊 我们都知道,要想知道程序的运行结果,就需要将结果给打印到屏幕上,那么 python 是怎样将程序输出到屏幕上的呢?这

    2024年02月11日
    浏览(26)
  • 【JavaSE】数据类型和运算符

    从这一篇我们开始Java的学习~ 欢迎关注个人主页:逸狼 创造不易,可以点点赞吗~ 如有错误,欢迎指出~ 目录 前言 Java第一个程序 字面常量 字面常量的分类 结合代码理解 类型转换 类型提升  byte与byte的运算 正确写法 字符串类型String int与String相互转换 int转String String转int 算

    2024年03月28日
    浏览(38)
  • JAVA——数据类型与运算符

    注意事项: 1.初始化操作是可选的, 但是建议创建变量的时候都显式初始化.                   2. 最后不要忘记分号, 否则会编译失败.                   3.初始化设定的值为 10L , 表示一个长整型的数字. 10l 也可以.                   4.float 类型在 Java 中占四个字节, 遵守

    2024年01月19日
    浏览(56)
  • JavaSE ---01 数据类型与运算符

    正所谓温故而知新,可以为师矣,虽然已经学过一遍javase,但是回头复习仍然能找到很多初学的时候遗忘的点,所以我们在学习的途中还是要保持空杯心态,这样才能走的更远, 切忌眼高手低 . 说到变量大家都经常去使用,那么什么是变量呢?下面给出变量的定义 变量指的是程序运行时

    2024年02月08日
    浏览(34)
  • Java数据类型,变量与运算符

    常量是在程序运行期间,固定不变的量称为常量。 在以上程序中,输出的Hello Word,其中的“Hello Word”就是字面常量。 字面常量的分类: 字符串常量 整形常量 浮点数常量 字符常量 布尔常量 空常量 注意:字符串,整形,浮点型,字符型以及布尔型,在Java中都称为数据类型

    2024年02月08日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包