返回顶部
首页 > 资讯 > 数据库 >MySQL 数值类型溢出处理
  • 878
分享到

MySQL 数值类型溢出处理

2023-06-02 16:06:09 878人浏览 八月长安
摘要

推荐阅读:吊打面试官!MySQL灵魂100问,你能答出多少?来,考考大家一个问题,在 Mysql 中当某一列设置为 int(0) 时会发生什么 ?为了演示这个问题,我们先要创建一个表 DROP TABLE IF EXISTS `na

推荐阅读吊打面试官!MySQL灵魂100问,你能答出多少?

来,考考大家一个问题,在 Mysql 中当某一列设置为 int(0) 时会发生什么 ?

为了演示这个问题,我们先要创建一个表

 DROP TABLE IF EXISTS `na`;CREATE TABLE `na` (  n1 INT(0)  NOT NULL DEFAULT '0',  n2 INT(11) NOT NULL DEFAULT '0');

然后我们使用下面的语句往 na 表中插入一些数据

 mysql> INSERT INTO `na` VALUES(520,520),(5201314,5201314);Query OK, 2 rows affected (0.02 sec)Records: 2  Duplicates: 0  Warnings: 0

最后我们读取出来看看

 mysql> SELECT * FROM na;+---------+---------+| n1      | n2      |+---------+---------+|     520 |     520 || 5201314 | 5201314 |+---------+---------+2 rows in set (0.00 sec)

对的,好像什么都不会发生,没什么问题才是对的,我就怕有什么问题…哈哈

我们这一章节来讲讲整型溢出问题。

MySQL 数值类型溢出处理

当 MySQL 在某个数值列上存储超出列数据类型允许范围的值时,结果取决于当时生效的 SQL 模式

  • 如果启用了严格的 SQL 模式,则 MySQL 会根据 SQL 标准拒绝带有错误的超出范围的值,并且插入失败
  • 如果没有启用任何限制模式,那么 MySQL 会将值裁剪到列数据类型范围的上下限值并存储

    1. 当超出范围的值分配给整数列时,MySQL 会存储表示列数据类型范围的相应端点的值

    2. 当为浮点或定点列分配的值超出指定(或默认)精度和比例所隐含的范围时,MySQL 会存储表示该范围的相应端点的值

这个,应该很好理解吧?

我们举一个例子,假设 t1 表的结构如下

 CREATE TABLE t1 (    i1 TINYINT,    i2 TINYINT UNSIGNED);

如果启用了严格的 SQL 模式,超出范围会发生一个错误

 mysql> SET sql_mode = 'TRADITioNAL';  -- 首先设置严格模式mysql> INSERT INTO t1 (i1, i2) VALUES(256, 256);ERROR 1264 (22003): Out of range value for column 'i1' at row 1mysql> SELECT * FROM t1;Empty set (0.00 sec)

当严格模式被禁用,值可以插入,但会被裁剪,并且引发一个警告

 mysql> SET sql_mode = '';  -- 禁用所有模式mysql> INSERT INTO t1 (i1, i2) VALUES(256, 256);mysql> SHOW WARNINGS;+---------+------+---------------------------------------------+| Level   | Code | Message         |+---------+------+---------------------------------------------+| Warning | 1264 | Out of range value for column 'i1' at row 1 || Warning | 1264 | Out of range value for column 'i2' at row 1 |+---------+------+---------------------------------------------+mysql> SELECT * FROM t1;+------+------+| i1   | i2   |+------+------+|  127 |  255 |+------+------+

如果未启用严格 SQL 模式,对于 ALTER TABLELOAD DATA INFILEUPDATE 和多行 INSERT等语句会由于裁剪而发生的列分配转换并且引发一个警告。

而如果启用了严格模式,这些语句会直接失败,并且未插入或更改部分或全部值,具体取决于表是否为事务表和其他因素。

数值表达式求值过程中的溢出会导致错误,例如,因为最大的有符号 BIGINT 值是 9223372036854775807,因此以下表达式会产生错误

 mysql> SELECT 9223372036854775807 + 1;ERROR 1690 (22003): BIGINT value is out of range in '(9223372036854775807 + 1)'

为了在这种情况下使操作成功,需要将值转换为 unsigned

 mysql> SELECT CAST(9223372036854775807 AS UNSIGNED) + 1;+-------------------------------------------+| CAST(9223372036854775807 AS UNSIGNED) + 1 |+-------------------------------------------+|                       9223372036854775808 |+-------------------------------------------+

从另一方面说,是否发生溢出取决于操作数的范围,因此处理前一个表达式的另一种方法是使用精确值算术,因为 DECIMAL 值的范围大于整数

 mysql> SELECT 9223372036854775807.0 + 1;+---------------------------+| 9223372036854775807.0 + 1 |+---------------------------+|     9223372036854775808.0 |+---------------------------+

整数数值之间的减去,如果其中一个类型为 UNSIGNED ,默认情况下会生成无符号结果。如果为负,则会引发错误

 mysql> SET sql_mode = '';Query OK, 0 rows affected (0.00 sec)mysql> SELECT CAST(0 AS UNSIGNED) - 1;ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'

这种情况下,如果启用了 NO_UNSIGNED_SUBTRACTION SQL 模式,则结果为负

 mysql> SET sql_mode = 'NO_UNSIGNED_SUBTRACTION';mysql> SELECT CAST(0 AS UNSIGNED) - 1;+-------------------------+| CAST(0 AS UNSIGNED) - 1 |+-------------------------+|                      -1 |+-------------------------+

如果此类操作的结果用于更新 UNSIGNED 整数列,则结果将裁剪为列类型的最大值,如果启用了 NO_UNSIGNED_SUBTRACTION 则裁剪为 0。但如果启用了严格的 SQL 模式,则会发生错误并且列保持不变。

后记

一切都是套路,套路….基本都和 SQL 模式有关…

您可能感兴趣的文档:

--结束END--

本文标题: MySQL 数值类型溢出处理

本文链接: https://lsjlt.com/news/230506.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • MySQL 数值类型溢出处理
    推荐阅读:吊打面试官!MySQL灵魂100问,你能答出多少?来,考考大家一个问题,在 MySQL 中当某一列设置为 int(0) 时会发生什么 ?为了演示这个问题,我们先要创建一个表 DROP TABLE IF EXISTS `na...
    99+
    2023-06-02
  • MySQL数值类型溢出的处理方法
    来,考考大家一个问题,在 MySQL 中当某一列设置为 int(0) 时会发生什么 ? 为了演示这个问题,我们先要创建一个表 DROP TABLE IF EXISTS `na`; CREATE TABL...
    99+
    2024-04-02
  • MySQL CAST 如何处理溢出?
    MySQL CAST 可以处理数值表达式评估期间发生的溢出。假设如果数值表达式计算产生溢出,则 MySQL 会反映一条错误消息。现在为了处理这个溢出,我们可以在 CAST 的帮助下将该数值更改为 UNSIGNED。例如,在 BIGINT 最...
    99+
    2023-10-22
  • MySQL数据类型 - 数据类型默认值
    数据类型默认值 数据类型规范可以有显式或隐式的默认值。 数据类型规范中的DEFAULT值子句显式指示列的默认值。示例: SERIAL DEFAULT VALUE是一种特殊情况。在整数列的定义中,它是NOT NULL AUTO_INCREM...
    99+
    2021-04-15
    MySQL数据类型 - 数据类型默认值 数据库入门 数据库基础教程 数据库 mysql
  • css溢出怎么处理
    css溢出处理方法:针对超出容器内容的处理,css提供了几种方法:可见溢出:显示超出内容隐藏溢出:剪切超出内容滚动溢出:添加滚动条缩小溢出:强制显示滚动条剪切溢出:完全隐藏超出内容选择合...
    99+
    2024-05-21
    css 绝对定位 overflow
  • 怎么理解MYSQL数据类型存储中数值型
    怎么理解MYSQL数据类型存储中数值型,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。探索MYSQL 数值类型的存储,以及解读方...
    99+
    2024-04-02
  • MySQL基础教程1 —— 数据类型之数值类型
    MySQL支持所有标准SQL数值数据类型。这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似数值数据类型(FLOAT、REAL和DOUBLE PRECISI...
    99+
    2022-05-31
    MySQL SQL 数值 数据类型 整型 浮点型
  • MySQL中有哪些数值类型
    今天就跟大家聊聊有关MySQL中有哪些数值类型,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。数值类型 MySQL 的数值数据类型可以大致划...
    99+
    2024-04-02
  • jvm内存溢出如何处理
    JVM内存溢出是指在Java虚拟机执行程序时,无法分配到足够的内存空间,导致程序异常终止。处理JVM内存溢出的方法有以下几种:1. ...
    99+
    2023-08-11
    jvm
  • kafka内存溢出如何处理
    Kafka内存溢出可以通过以下几种方式进行处理: 增加Kafka的堆内存:可以通过调整Kafka的JVM参数,增加堆内存大小,例...
    99+
    2023-10-27
    kafka
  • mysql中clob类型数据怎么处理
    在MySQL中,CLOB(Character Large Object)类型数据通常指代文本类型数据,例如长文本、大段文本或者大型文...
    99+
    2024-04-09
    mysql
  • Python数据类型 -数值类型(整数,
    一、整数:1)整型(Int) - 通常被称为是整型或整数,是正或负整数,不带小数点。Python3 整型是没有限制大小的,可以当作 Long 类型使用,所以 Python3 没有 Python2 的 Long 类型。如:num01 =100...
    99+
    2023-01-31
    整数 数值 数据类型
  • Python数值类型
    数值类型 python的数值类型包括常规的类型:整数(没有小数部分的数字)、浮点数(通俗地说,就是有小数部分的数字)以及其它数值类型(复数、分数、有理数、无理数、集合、进制数等)。除了十进制整数,还有二进制数、八进制数、十六进制数。 ...
    99+
    2023-01-30
    数值 类型 Python
  • Python--数值类型
    Python数值类型 变量-变量是内存中的一块区域。变量的命名:变量由字母,数字,下划线组成。python中地址变量与c语言刚好相反,一条数据包含包含多个标签;  1、Input与raw_input区别Print + 字符串Input + ...
    99+
    2023-01-31
    数值 类型 Python
  • 【MYSQL】InnoDB行溢出数据说明
        首先说下MySQL数据库的varchar字段,真的很实用,它可以存放65536字节的数据,比oracle和sqlserver大多了,但是在使用varchar时也有几点要注意; ...
    99+
    2024-04-02
  • mysql连接数溢出怎么办
    解决 mysql 连接数溢出:增加 max_connections 参数值;优化连接池以减少连接创建和销毁;清理空闲连接释放资源;优化查询负载降低连接占用;分片数据库分散连接;使用连接限...
    99+
    2024-05-22
    mysql mongodb mysql连接
  • MySQL列类型中的数值型详细教程
    下文主要给大家带来MySQL列类型中的数值型详细教程,希望这些内容能够带给大家实际用处,这也是我编辑MySQL列类型中的数值型详细教程这篇文章的主要目的。好了,废话不多说,大家直接看下文吧。  &...
    99+
    2024-04-02
  • MySQL支持哪些SQL数值数据类型
    这篇文章给大家分享的是有关MySQL支持哪些SQL数值数据类型的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。  MySQL中定义数据字段的类型对你数据库的优化是非常重要的。  M...
    99+
    2024-04-02
  • oracle --date-对应 mysql 时间类型的以及空值的处理
    因为在做Oracle---->mysql的数据迁移的时候,发现Oracle中的date类型,对应的mysql的时间类型设置不当容易引起错误,特别是存在空值的时候 mysql 版本 5.6.40版本...
    99+
    2024-04-02
  • mysql如何将值转换数字类型
    本篇内容介绍了“mysql如何将值转换数字类型”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作