当前位置:  数据库>mysql

MySQL整型数据溢出的解决方法

    来源: 互联网  发布时间:2014-10-16

    本文导语:  今天接到一个朋友电话说是觉的数据库被别人更改了,出现数据不对的问题 。经过很久的排查是数据类型溢出了(发生问题的版本是MySQL 5.1)。后来通过给朋友那边把MySQL 5.1升级到MySQL 5.5去解决这个问题。 这也让我有...

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

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

pe Storage Minimum Value Maximum Value 存储大小   (Bytes) (Signed/Unsigned) (Signed/Unsigned) byte TINYINT 1 -128 127 1 byte     0 255   SMALLINT 2 -32768 32767 2 bytes     0 65535   MEDIUMINT 3 -8388608 8388607 3 bytes     0 16777215   INT 4 -2147483648 2147483647 4 bytes     0 4294967295   BIGINT 8 -9223372036854775808 9223372036854775807 8 bytes     0 18446744073709551615  

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

代码如下:

SELECT CAST(0 AS UNSIGNED) - 1;

SELECT 9223372036854775807 + 1;

MySQL 5.1 下:

代码如下:

mysql> SELECT CAST(0 AS UNSIGNED) - 1;
+-------------------------+
| CAST(0 AS UNSIGNED) - 1 |
+-------------------------+
|    18446744073709551615 |
+-------------------------+
1 row in set (0.01 sec)

mysql> SELECT 9223372036854775807 + 1;
+-------------------------+
| 9223372036854775807 + 1 |
+-------------------------+
|    -9223372036854775808 |
+-------------------------+
1 row in set (0.01 sec)

MySQL 5.5, 5.6, 5.7下:

代码如下:

mysql> SELECT CAST(0 AS UNSIGNED) - 1;
ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'
mysql>
mysql>
mysql>
mysql> SELECT 9223372036854775807 + 1;
ERROR 1690 (22003): BIGINT value is out of range in '(9223372036854775807 + 1)'

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

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

更多详情参考: http://dev.mysql.com/doc/refman/5.7/en/out-of-range-and-overflow.html


    
 
 

您可能感兴趣的文章:

  • mysql unsigned 用法及相减出现补数溢出解决方法
  • mysql启动错误之mysql启动报1067错误解决方法
  • MySql报错Table mysql.plugin doesn’t exist的解决方法
  • MYSQL安装时解决要输入current root password的解决方法
  • php连接不上mysql但mysql命令行操作正常的解决方法
  • mysql修改用户密码的方法和mysql忘记密码的解决方法
  • 安装好的Redhat Linux 8.0,带Apache和php支持,安装上Mysql后,运行正常,但检测提示php不支持Mysql,如何解决?
  • mysql服务无法启动报错误1067解决方法(mysql启动错误1067 )
  • mysql解决远程不能访问的二种方法
  • MYSQL不能从远程连接的一个解决方法(s not allowed to connect to this MySQL server)
  • 如何解决连接mysql的权限问题?
  • windows7下启动mysql服务出现服务名无效的原因及解决方法
  • mysql忘记密码的解决方法
  • Web服务器/前端 iis7站长之家
  • mysql 提示INNODB错误的解决方法
  • DOS命令行窗口mysql中文显示乱码问题解决方法
  • 解决bash: mysql: command not found 的方法
  • mysql query browser中文乱码的解决方法
  • mysql远程登录出错的解决方法
  • mysql4.0升级到mysql5(4.1),解决字符集问题
  • Mysql的longblob字段插入数据问题解决
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • mysql中字符串和时间互相转换的方法(自动转换及DATE_FORMAT函数)
  • linux mysql登陆出错 mysql升级方法
  • MySQL降权运行之MySQL以Guests帐户启动设置方法
  • mysql修改密码的三方法和忘记root密码的解决方法
  • 强制修改mysql的root密码的六种方法分享(mysql忘记密码)
  • 修改mysql密码与忘记mysql密码的处理方法
  • linux忘记mysql密码处理方法
  • mysql Master-Master-Slaves有谁会么?求教linux下mysql Master-Master-Slaves配置方法
  • mysql中文排序注意事项与实现方法
  • mysql 查看版本的方法图文演示
  • 免安转MySQL服务的启动与停止方法
  • 绿色版mysql注册卸载服务方法
  • php连接mysql二种方法 mysql乱码问题
  • linux下mysql提示"mysql deamon failed to start"错误的解决方法
  • 配置mysql允许远程连接的方法
  • Mysql导出数据的正确方法
  • 关于MYSQL 远程登录的授权方法 命令
  • VPS下修改MySQL root用户密码的方法
  • mysql手动删除BINLOG的方法
  • 如何解决mysql重装失败方法介绍
  • MySQL防止delete命令删除数据的两种方法
  • mysql中如何查看最大连接数(max_connections)和修改最大连接数
  • 在 linux下输入"mysql"命令,进入mysql命令行,但出现“Can't connetc to local MySQL server thuough socket /var/lib/mysql/mysql.sock
  • Mysql查询错误:ERROR:no query specified原因
  • MySQL 重装MySQL后, mysql服务无法启动
  • php安装完成后如何添加mysql扩展
  • 为什么用linux安装盘安装了mysql后,启动mysql,提示找不到mysql.sock文件?
  • mysql中查询当前正在运行的SQL语句并找出mysql中运行慢的sql语句
  • 請教,在redhat linux7.2+mysql 中,系統提示mysql已啟動,網頁卻不能訪問mysql?
  • Myeclipse中自带Tomcat的JDBC连接池配置(mysql和mssql)
  • 求解释: useradd -g mysql mysql -d /home/mysql -s /sbin/nologin


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3