`
xubindehao
  • 浏览: 243925 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

mysql5 unsigned 相减出现补数 溢出 解决办法

阅读更多

2010-08-17 17:36

在网上查询了下,大概都是下面这个文章,文章很不错,但是就是说注意 ,没有提出解决方法。现在我来补充下,下面先说下这个文章,然后给出答案


所有整数类型可以有一个可选(非标准)属性UNSIGNED。当你想要在列内只允许非负数和该列需要较大的上限数值范围时可以使用无符号值。
mysql4:
mysql> create table wubx(a TINYINT  unsigned not null default '0'); 
Query OK, 0 rows affected (0.04 sec)
mysql> select * from wubx;
Empty set (0.00 sec)
mysql> insert wubx values(0);
Query OK, 1 row affected (0.00 sec)
mysql> select * from wubx;  
+------+
| a    |
+------+
|    0 |
+------+
1 row in set (0.00 sec)
mysql> update wubx set a=a-1;
Query OK, 0 rows affected, 1 warning (0.00 sec)
Rows matched: 1  Changed: 0  Warnings: 1
mysql> select * from wubx;  
+------+
| a    |
+------+
|    0 |
+------+
1 row in set (0.00 sec)

mysql5:

(root@localhost) [test]> create table wubx(a int(11) unsigned not null default '0'); 
Query OK, 0 rows affected (18.44 sec)
(root@localhost) [test]> select  * from wubx; 
Empty set (0.00 sec)
(root@localhost) [test]> insert into wubx values(0);
Query OK, 1 row affected (0.00 sec)
(root@localhost) [test]> update wubx set a=a-1;
Query OK, 1 row affected, 1 warning (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 1
(root@localhost) [test]> select  * from wubx;      
+------------+
| a          |
+------------+
| 4294967295 |
+------------+
1 row in set (0.00 sec)
mysql> show warnings;
+---------+------+-----------------------------------------------------+
| Level   | Code | Message                                             |
+---------+------+-----------------------------------------------------+
| Warning | 1264 | Out of range value adjusted for column 'a' at row 1 |
+---------+------+-----------------------------------------------------+


查了一下:
在对于数值处理时:

MySQL4 会在不合规定的值插入表前自动修改为 0
Mysql5 为了速度,只存放数二进制数据,而且在加减运算中,也是二进制的运算.

所以在使用unsigned 是小心0-1 的操作.尽量在这类操作前先做一个判断.

如果直接在程序里进行判定,难免会出现数据错误,因为有一点点时间内数据是放在内存的,而没放进库里,最好的办法还是直接送出sql语句进行修改,这里mysql5有解决办法 CONVERT( 字段 + (要加减的数字) AS SIGNED )就可以了。

例如:UPDATE `user` SET `tk` = CONVERT( tk +  (-8)  AS SIGNED ) WHERE `id` = '1330'

分享到:
评论

相关推荐

    mysql unsigned 用法及相减出现补数溢出解决方法

    在MySQL 5中,可以使用`CONVERT()`函数配合`AS SIGNED`来避免溢出问题。例如,更新一个`tk`字段,减去8,可以写成这样的SQL语句: ```sql UPDATE `user` SET `tk` = CONVERT( tk + (-8) ,SIGNED ) WHERE `id` = '...

    单片机C51-绝对地址 16位数相减

    以上代码展示了如何在C51中处理绝对地址的16位数相减,以及如何检查和处理可能出现的溢出。在实际编程中,根据项目需求,你可能还需要进行更复杂的错误检查和异常处理。理解这种基本操作是单片机编程的基础,有助于...

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

    当主库和从库使用不同版本的MySQL时,可能会因为溢出处理方式的差异而出现同步问题,因此推荐保持所有数据库实例在同一版本,以确保一致性。 总之,理解和预防MySQL中的整型溢出是保证数据安全和应用正确性的重要...

    MYSQL在WINDOWS下中文显示的解决办法

    解决这个问题需要对MySQL的配置、数据表创建以及客户端连接进行相应的调整。以下是一份详细的步骤指南: 1. **确认MySQL版本**: 首先,确保你的MySQL服务器版本是5.1.55或更高。不同版本的MySQL可能对字符集的...

    MySQL表自增id溢出的故障复盘解决

    MySQL表自增id溢出是数据库管理中可能出现的一种情况,特别是在高并发写入场景下,如果表设计不当,可能会导致自增id超出其数据类型的范围,进而引发一系列问题。本故障复盘解决的过程旨在提供一个应对策略,确保...

    activerecord-mysql-unsigned:启用使用整数类型中的“ unsigned”选项来迁移ActiveRecord

    Activerecord :: Mysql ::未签名 为ActiveRecordMySQL2适配器将无符号选项添加到整数类型。 支持版本 5.0 > ActiveRecord::VERSION >= 3.2 安装 将此行添加到您的应用程序的Gemfile中: gem 'activerecord-mysql...

    避免计算过程中出现溢出

    根据给定的信息,本文将详细解释如何通过一次遍历找到一个长度为n的数组中缺失的数字a和重复出现的数字b。数组由1至n的整数组成,其中数字a缺失,数字b出现了两次,其余数字各出现一次。本文还将讨论如何在计算过程...

    8-bit-unsigned-number.rar_Unsigned_labview 符号数

    在这个"8-bit-unsigned-number.rar"压缩包中,包含了一个名为"8位无符号采数.vi"的虚拟仪器(VI),这显然是一个LabVIEW程序,旨在实现8位无符号数字的采集和波形显示。 8位无符号数字表示的是一个可以在0到255之间...

    详解MySQL 表中非主键列溢出情况监控

    通过这样的监控和预防措施,可以及时发现并处理可能出现的非主键列溢出问题,保障数据库的稳定运行,降低因数据溢出导致的数据丢失或错误的风险。在数据库设计和运维过程中,应时刻关注数据类型的选取,合理预估数据...

    jsp+mysql中文乱码解决方案集合

    ### jsp+mysql中文乱码解决方案集合 在使用JSP结合MySQL进行Web应用开发时,中文乱码问题一直是困扰开发者的一大难题。本文将详细介绍如何在MySQL数据库层面解决中文乱码问题,并提供一系列实用的方法和技巧。 ###...

    中国5级省市县镇村MySQL完整数据-SQL文件

    中国五级省市县镇村的MySQL完整数据,已经做成SQL文件,带建表语句 /* Navicat MySQL Data Transfer Target Server Type : MYSQL Target Server Version : 50612 File Encoding : 65001 Date: 2017-03-07 16:05:...

    mysql语法文档

    mysql语法文档 ... * my_ulonglong mysql_affected_rows(MYSQL *mysql):返回最后一个update、delete、insert操作影响的记录数 * my_ulonglong mysql_num_rows(MYSQL_RES *res):返回查询结果的行数

    linux(centos) 下C++连接mysql数据库

    5. **结果集处理**:如果查询成功,使用`MYSQL_RES* mysql_store_result(MYSQL*)`获取结果集,然后通过`MYSQL_ROW`遍历每一行数据。 6. **关闭连接**:最后,别忘了在完成所有操作后,使用`void mysql_close(MYSQL*...

    MySQL数值类型溢出的处理方法

    MySQL数值类型溢出是指在MySQL数据库中,当存储的数据超出其定义的数据类型所允许的范围时发生的错误。处理MySQL数值溢出的方法取决于是否启用了严格的SQL模式。在介绍这些处理方法之前,先要了解不同的数值类型和...

    用“UL”避免Keil C51大整数常量运算溢出错误

    解决这种溢出错误的方法是使用“UL”指定大整数的数据类型,即: #define SYSCLK 22118400UL 这样可以将22118400指定为无符号长整型,从而避免溢出错误。这也是为了提高代码的可读性和规范性。 在编程中,我们...

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

    在MySQL 5.1中,当执行某些可能导致溢出的操作时,例如`SELECT CAST(0 AS UNSIGNED) - 1`,结果会超出BIGINTUNSIGNED的最大值,但并不会引发错误,而是返回一个超出范围的值。而在5.5及以上版本中,这种操作会触发...

    mysql使用中需要注意事项

    如果数据库连接出现了问题,需要重置连接,此时应该重新建立连接,并且重新调用与MySQL连接相关的函数,如mysql_stmt_init。为了检查数据库连接是否有效,可以使用mysql_ping函数。MySQL连接有两种实现方式:一种是...

    中国行政区域,邮政编码,5级行政区域mysql库

    `id` mediumint(7) unsigned NOT NULL AUTO_INCREMENT, `level` tinyint(1) unsigned NOT NULL COMMENT '层级', `parent_code` bigint(14) unsigned NOT NULL DEFAULT '0' COMMENT '父级行政代码', `area_code` ...

    mysql处理添加外键时提示error 150 问题的解决方法

    MySQL 处理添加外键时提示 Error 150 问题的解决方法 MySQL 中添加外键时,可能会遇到 Error 150 的问题,这个问题是 MySQL 本身的 bug,已经被报告到 MySQL 开发者列表中很多年了。然而,导致这个错误的原因却并...

Global site tag (gtag.js) - Google Analytics