当将具有多个前导零的字符串转换为数字值时,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中,这种情况不会发生
发布于 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,他们已经解决了这个问题
https://stackoverflow.com/questions/62931303
复制相似问题