【问题标题】:Django DecimalField not respecting max_digits and causing Buffer Overflow/TruncationDjango DecimalField 不尊重 max_digits 并导致缓冲区溢出/截断
【发布时间】:2025-12-22 06:55:14
【问题描述】:

我正在使用 Microsoft SQL Server,ODBC Driver 13 for SQL Server with Django 2.0.1

这实际上发生在我所有的十进制字段中,我希望我遗漏了一些简单的东西。

我已在我的模型中声明:

Overhead = models.DecimalField(max_digits=6, decimal_places=4, db_column='overhead')

用它制作了一个模型表单,它实际上验证了有太多数字(例如:100.0000),并且当设置为比声明的数量少一(例如:9.0000)时正确更新。与 max_digits 匹配的任何位数都会导致截断错误:

String data, right truncation: length 14 buffer 12

如果我用 DecimalField 声明如下重复相同的情况:

models.DecimalField(max_digits=9, decimal_places=2, db_column='subtotal')

我从数据库驱动程序 (22001) 得到相同的错误类型,溢出量略有不同:

String data, right truncation: length 26 buffer 24

为日志中的更新语句生成的 SQL 可以在 SQL Server 的 SQL 编辑器中复制/粘贴并使用完全相同的参数,并且可以愉快地更新记录。我一直在想,在 Django 编译 SQL 和执行它的数据库驱动程序之间发生了一些事情,但我不确定我什至会寻找什么,因此感谢任何帮助。

【问题讨论】:

  • 可能与 GitHub 问题 here 重复。
  • 100% 正确,pyodbc 升级到 4.0.23 解决了这个问题。

标签: sql-server django pyodbc


【解决方案1】:

根据 Gord Thompson 的评论,将 pyodbc 升级到 4.0.23 解决了该问题。

【讨论】: