首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL和MariaDB -将表示十进制值的字符串用许多前导零转换为数字值,会产生意想不到的结果。

问MySQL和MariaDB -将表示十进制值的字符串用许多前导零转换为数字值,会产生意想不到的结果。
EN

Stack Overflow用户
提问于 2020-07-16 09:10:58
回答 1查看 81关注 0票数 1

当将具有多个前导零的字符串转换为数字值时,MySQL和MariaDB给出了一个意外的结果--启用了严格模式Out of range value错误,并显示了禁用的严格模式Out of range value警告,并以给定的精度将结果夹紧到最大十进制值。例如:

SELECT CAST(0000000000000000000000000000000000000000000000000000000000000000000000000000000020.01 AS DECIMAL(15,2)) as val;给出9999999999999.99

但实际上,超出范围的并不是价值,它只是有许多前导零的价值!为什么是这样的?在MS SQL和PostgreSQL中,这种情况不会发生

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-16 09:10:58

当我们开始研究这个行为时,当输入字符串大于83个符号时,错误会在禁用的严格模式下发生。83限制与MySQL C源代码中的DECIMAL_MAX_STR_LENGTH常数有关,当输入字符串大于该常数时,结果值被设置为具有给定精度的最大十进制值。该bug存在于MySQL 8.0和MariaDB 10.4.13中,也可能出现在他们的旧版本中。

这在某些情况下可能是危险的,例如在使用MySQL的在线金融服务中。一个恶意的人可以利用这个错误从它的帐户中获取大量的钱,方法是输入多个前导零的和。

我们将这个bug 已报告给MySQL开发人员,他们回答说

已知的行为。简单地说,数字数据类型有其局限性。这个特殊的限制不是很好的描述,特别是当你溢出时会发生磨擦的部分。

他们决定不修复这个问题,但是在他们的文档中添加了它的描述。

我们也是已报告到MariaDB,他们已经解决了这个问题

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62931303

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档