mysql 字符串比较 坑点

有个骚操作需要根据订单号扣费,订单号在数据库里是varchar类型,长度64,大概就是和时间戳差不多的纯数字字符串

但是经过测试发现,有一些订单会无缘无故扣费,当时我的SQL语句是这样写的

SQL := fmt.Sprintf("update xxx set count = count + %d,last_up_time = %d where order_id = %s ", money, last_up_time, order_id)

我把每次调用这句SQL的时候都打印出来,发现有一些订单莫名其妙扣了钱都是日志里面没有记录,于是想难道是中出了一个家伙也会操作这张表?问了一波发现没有

通过mysql的binlog查看,发现每一次update某个订单的时候还会顺着update好几个订单,我懵逼

于是把日志打印出来的sql语句亲身执行了一下,发现受影响的行居然大于1 ???

update xxx set count = count + 15,last_up_time = 1524732272 where order_id = 2018042611408321524710026

当时日志的sql如上,问了一波人,发现了把order_id那里要加上引号,就可以正确扣费了

后来google了一波,原来mysql里如果是字符串类型,每当和数字比较,会把字符串转化成int再和数字比较,由于mysql默认最大支持20位int转化,而我们的order_id前面20位是日期时间戳之类的,所以特别容易会重复,于是就GG了

而加上引号之后,这个order_id就变成字符串了,字符串和字符串比较就稳了

MySQL中,当进行字符串比较时,采用的是字符串方式比较大小。即从左往右进行匹配。如果对比的两个字符串长度不同,先比较较短的字符串,如果较短字符串比较完后还没有大小之分,则认为较长的字符串较大。例如,对于以下SQL语句: ``` SELECT '2019-09-30' < '2019-09-30 00:00:00' ``` 由于字符串 '2019-09-30' 长度较短,比较完后还没有大小之分,因此认为较长的字符串 '2019-09-30 00:00:00' 较大。 此外,如果字段使用的是字符串形式存储,那么在比较大小时也是按照字符串方式进行的。这意味着可能会出现意料之外的结果。比如,当你查询MySQL时,如果没有查询到内容,可能是因为你使用了字符串方式比较大小,导致查询条件不符合预期。 如果你想了解更多关于MySQL字符串与数字比较的相关内容,可以参考以下链接: - [MySQL字符串与数字比较](https://www.cnblogs.com/micrari/p/6358652.html) - [教程-最全ASCII码对照表](https://www.cnblogs.com/FKdelphi/p/4683114.html) <span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [MySQL字符串比较大小(日期字符串比较问题)](https://blog.csdn.net/m0_67391121/article/details/126062145)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [MySQL 字符串和数值比较字符串字符串比较](https://blog.csdn.net/leiwuhen92/article/details/106421050)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值