• 技术文章 >数据库 >mysql教程

    关于MySQL的整型数据的内存溢出问题的应对方法_MySQL

    2016-06-01 13:00:50原创522
    今天接到一个朋友电话说是觉的数据库被别人更改了,出现数据不对的问题 。经过很久的排查是数据类型溢出了(发生问题的版本是MySQL 5.1)。后来通过给朋友那边把MySQL 5.1升级到MySQL 5.5去解决这个问题。 这也让我有兴趣去了解一下MySQL不同版本数据类型溢出的处理机制。

    先看一下MySQL支持的整型数及大小,存储空间:

    201559103624773.jpg (576×316)

    另外请记着mysql的数据处理会转成bigint处理,所以这里就用bigint几个测试:

    SELECTCAST(0ASUNSIGNED)-1;
     
    SELECT9223372036854775807+1;
    
    

    MySQL 5.1 下:

    mysql>SELECTCAST(0ASUNSIGNED)-1;
    +-------------------------+|CAST(0ASUNSIGNED)-1|+-------------------------+|18446744073709551615|+-------------------------+1ROWINSET(0.01 sec)
     
    mysql>SELECT9223372036854775807+1;
    +-------------------------+|9223372036854775807+1|+-------------------------+|-9223372036854775808|+-------------------------+1ROWINSET(0.01 sec)
    
    

    MySQL 5.5, 5.6, 5.7下:

    mysql>SELECTCAST(0ASUNSIGNED)-1;
    ERROR 1690(22003): BIGINTUNSIGNEDVALUEISOUTOF range IN'(cast(0 as unsigned) - 1)'
    mysql> 
    mysql> 
    mysql> 
    mysql>SELECT9223372036854775807+1;
    ERROR 1690(22003): BIGINTVALUEISOUTOF range IN'(9223372036854775807 + 1)'
    
    

    所在处理这类数据是一定要小心溢出(如早期有做弊冲Q币就是利用这个方法处理)

    这个问题有可能会出现积分消息,积分相加, 或是一些钱相关的业务中出现, 主库5.1 ,从库MySQL 5.5情况也会出现不同步的问题。
    建议:这类业务系统尽可能的升级到MySQL 5.5后版本 

    声明:本文原创发布php中文网,转载请注明出处,感谢您的尊重!如有疑问,请联系admin@php.cn处理
    专题推荐:MySQL
    上一篇:提高MySQL中InnoDB表BLOB列的存储效率的教程_MySQL 下一篇:修改Innodb的数据页大小以优化MySQL的方法_MySQL
    大前端线上培训班

    相关文章推荐

    • 讲解mysql8.0的部分简单配置• CentOS7 MySQL怎么进行定时备份• Kubernetes是什么?如何基于它部署MySQL数据库• 分析Mysql索引下推是什么?是否有助优化?• 细说MySql中的分表、分库、分片和分区

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网