MySQL unsigned int类型数据使用一些事项

以 Signed 为例,可以储存 -2147483648 to 2147483647 而以 Unsigned 为例,可以储存 0 to 4294967295 不过在操作这类栏位的时候,必须要小心,以避免删过头,反而变成补血补满。

正常来讲,MySQL 在操作数字加减的时候,可以这样做

PgSQL

 代码如下 复制代码

-- transaction start--
SELECT `example` FROM `test` WHERE ID = :ID

-- 用程式计算 example 的新值,然后调回去

UPDATE `test` SET `example` = n WHERE ID = :ID;
-- commit transaction
-- transaction start--SELECT `example` FROM `test` WHERE ID = :ID

-- 用程式计算 example 的新值,然后调回去

UPDATE `test` SET `example` = n WHERE ID = :ID;

-- commit transaction 

不过比较聪明的人,大概都会这样做,以减少 Query 次数 (假设一次减 1)

PgSQL

 代码如下 复制代码

UPDATE `test` SET `example` = `example` - 1;

UPDATE `test` SET `example` = `example` - 1; 

不过,上面这行 SQL Statement 有个风险。由於没有做边界检查,所以当 example = 0 的时候,再减掉 1 就会变成 4294967295 。

以下图为例:

这是我自己的页面截图,图中的 Plurk 数达到 4,294,967,294 ,就是 42 亿多笔,假设我一秒发一笔出去,在我有生之年都戳不完 (1 * 86400 * 365 * 100 = 3153600000, 35 亿) 。页面连结

所以,当这个栏位是记录”金额”或是”点数”的时候,就会对资料造成很大的影响 (只要程式 transaction/work flow 没控制好,穷人也可以一夕致富) 。

虽然问题很严重,不过改善的方法也很简单,只要加上 WHERE 条件限制,就可以马上避免掉这个问题。

PgSQL

 代码如下 复制代码

UPDATE `test` SET  `example` = `example` - '1' WHERE  `example` > 0;

UPDATE `test` SET  `example` = `example` - '1' WHERE  `example` > 0; 

备?:关於这个问题已经回报官方了,不知道这个 BUG 何时会被修正过来

时间: 2024-07-29 20:02:07

MySQL unsigned int类型数据使用一些事项的相关文章

JSTL中取得int类型数据的长度

JSTL中没有把int类型转成string的函数,要想解决获得int类型数据的长度,缺失麻烦. 获得String数据的长度要jstl的fn即可${fn:length(string)},但是int数据呢? 经过测试,下面的方法可行: [java] view plain copy  print? <%       request.setAttribute("test",123);      %>      ${fn:length(fn:substring(test,0,10))

向mysql数据库时间类型数据插入失败

问题描述 向mysql数据库时间类型数据插入失败 以前存入的时间数据是 new Date(); dvciCheckInfoModel.setApplyTime(new Date()); dvciCheckInfoModel.setCreateDate(new Date()); 生日的格式是 现在我从数据库获取到这些时间后又需要重新update进去时却报错了 Field error in object 'dvciCheckInfoModel' on field 'applyTime': rejec

java-jdbc中向MySQL传String类型数据

问题描述 jdbc中向MySQL传String类型数据 jdbc中向MySQL传String类型数据,还有jdbc中添加,删除,修改信息的代码,以及然后添加窗口背景图片 解决方案 关于MySQL到JDBC类型映射 解决方案二: http://www.cnblogs.com/wuyuegb2312/p/3872607.html

保护MySQL数据库中重要数据的注意事项

本文介绍了保护MySQL数据库中重要数据受外部攻击的六个注意事项,以减少面临的风险. 与自动的数据库备份不同,对系统管理员来说,保护数据免受未授权用户的侵犯需要采取一定的行动.如果你用的是MySQL,就可以使用一些方便的功能来保护系统,来大大减少机密数据被未授权用户访问的风险. 企业最有价值的资产通常是其数据库中的客户或产品信息.因此,在这些企业中,数据库管理的一个重要部分就是保护这些数据免受外部攻击,及修复软/硬件故障. 在大多数情况下,软硬件故障通过数据备份机制来处理.多数数据库都自带有内置

MySQL中int类型详解

这个代表显示宽度 整数列的显示宽度与mysql需要用多少个字符来显示该列数值,与该整数需要的存储空间的大小都没有关系,比如,不管设定了显示宽度是多少个字符,bigint都要占用8个字节.     int是整型,(11)是指显示字符的长度,但要加参数的,最大为255,比如它是记录行数的id,插入10笔资料,它就显示00000000001 ~~~00000000010,当字符的位数超过11,它也只显示11位,如果你没有加那个让它未满11位就前面加0的参数,它不会在前面加0 声明整型数据列时,我们可以

php数据入库前清理 注意php intval与mysql的int取值范围不同

php保存数据到mysql 打算在dao层进行数据入库前的清理,比如varchar进行trim,int进行intval. 有一天突然想起,php intval的取值范围与mysql的int类型一样吗? 查了一下,不一样-- http://php.net/manual/en/function.intval.phphttp://dev.mysql.com/doc/refman/5.1/zh/column-types.html#numeric-typesphp intval的取值范围:与操作系统相关,

vc获得sql里数据-vc获得mysql里int数据的语句

问题描述 vc获得mysql里int数据的语句 我知道vc获取mysql里char类型数据的语句是例如(工号是char类型时):varFld = pRs->Fields->GetItem(""max(工号)"")->Value;但是如果是获取int类型就不行了,例如(工号是int类型),上面的语句链接编译没错,运行出错.求代码.谢谢啦.没有Q币了,麻烦各位了 解决方案 你可以用字符串方式获取以后,自己再转换会int, atoi() 解决方案二: 我

详解MySQL数据类型int(M)中M的含义_python

介绍 MySQL 数据类型中的 integer types 有点奇怪.你可能会见到诸如:int(3).int(4).int(8) 之类的 int 数据类型.刚接触 MySQL 的时候,我还以为 int(3) 占用的存储空间比 int(4) 要小, int(4) 占用的存储空间比 int(8) 小. 后来,参看 MySQL 手册,发现自己理解错了. int(M): M indicates the maximum display width for integer types. 在 integer

c++-C++中的强制转换(unsigned int)&amp;amp;amp;是什么意思啊??

问题描述 C++中的强制转换(unsigned int)&是什么意思啊?? 在C++中的这段代码是什么意思?? int main (void) { using namespace std; int i; int m = (unsigned int)&i; //这里的&符号是神马意思啊???? cout << sizeof(st1) << "" "" << sizeof(st2) << "