mysql 数字加法_MySQL中大数字加减,不产生千位符和科学计数

本文介绍了在MySQL中处理大数字加法时如何防止出现科学计数法和千位分隔符的问题。通过存储过程演示了获取唯一流水号的过程,并展示了在数字加1操作中避免科学计数的正确方法,即使用CONVERT或CAST将数字转换为SIGNED类型后再进行加法运算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

mysql数字加减科学计数法

这两天因为需求,需要获取一张表的流水号。规则是这样的。当前日期+8位流水号。比如:2015062400000001,2015062400000002,2015062400000003....

因为考虑到并发问题,所以解决的方案是:在MySQL写存储过程,逻辑如下:

1、查询表今天流水号的最大主键值:如:

SELECTMAX(a.ORDER_ID)fromZhang_Test awhere1=1anda.order_idLIKECONCAT('%',nowDate,'%')

其中nowData 是:SELECT date_format(NOW(),'%Y%m%d') from dual   即当前日期,没有任何分隔符;如:20150624

2、判断是否有值,如果有+1。没有则为nowData + 00000001  如:2015062400000001;设置为今天第一个流水号。

3、向表插入数据,这样就把这个流水号占用了。如果有其他程序访问这个存储过程,那么就会在当前的流水号上再加1.

4、返回当前流水号

因为这些都是在存储过程中执行,所以就能有效保证获取的流水号是唯一的。这样就不会造成主键冲突。只是保存数据时,由新增变为了更新,因为获取的流水号在存储过程中就已经插入了一条数据,即表中已经有了这条数据。

遇见的问题:

再次过程中遇见的问题:

获取流水号时,如果查询出流水号那么我们在今天最大流水号+1,问题如下:

BEGIN

#Routine body goes here...

#需求获取序列号,格式为:8位日期 + 8位序列号  如2014082100000001

#查询时根据当前日期值【如:20140821】

# 定义最大序号值

DECLAREmaxSeqVARCHAR(20);

# 当前日期值

DECLAREnowDateVARCHAR(20);

# 获取当前日期值

setnowDate = (SELECTdate_format(NOW(),'%Y%m%d')fromdual);

# 获取最大序列值

SETmaxSeq = (SELECTMAX(a.ORDER_ID)fromZhang_Test awhere1=1anda.order_idLIKECONCAT('%',nowDate,'%') ); #'%20150623%'

#SETmaxSeq = 2015062399999888;

#SETmaxSeq = 2015062399999888+1;       # 99999888

SETmaxSeq = maxSeq+1;

INSERTINTOZhang_Test (order_id)VALUES(maxSeq);

# 获取序列信息

SELECTmaxSeq ;

END

结果如下:变为了科学计数。这肯定不是我们想要的。

6df2280813cb3b13039af74c9ec57272.png

如果:

SETmaxSeq = maxSeq+1; 变为==》SETmaxSeq = FORMAT(maxSeq+1,0);

那么结果为:

05efd944dfb7c0fb7fb8a08a90e93906.png

显然以上都不是我们所需要的。

所以我们应当这样:

SETmaxSeq = maxSeq+1; 变为==》SETmaxSeq =CONVERT(maxSeq,SIGNED)+1;  或者为:SETmaxSeq =CAST(maxSeqasSIGNED)+1;

结果为:

fea355d9cd1e67d14e92280bce5d5824.png

这便是我们所需要的结果了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值