Django DecimalField 不遵守 max_digits 并导致 Buffer Overflow/Truncation
Django DecimalField not respecting max_digits and causing Buffer Overflow/Truncation
我正在使用 Microsoft SQL 服务器,用于 SQL 服务器的 ODBC 驱动程序 13 和 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 可以是 copy/pasted 并且在 SQL 服务器的 SQL 编辑器中具有完全相同的参数,它愉快地更新记录。我一直在想在 Django 编译 SQL 和执行它的数据库驱动程序之间发生了一些事情,但我不确定我什至会寻找什么,所以任何帮助表示赞赏。
根据 Gord Thompson 的评论,将 pyodbc 升级到 4.0.23 解决了这个问题。
我正在使用 Microsoft SQL 服务器,用于 SQL 服务器的 ODBC 驱动程序 13 和 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 可以是 copy/pasted 并且在 SQL 服务器的 SQL 编辑器中具有完全相同的参数,它愉快地更新记录。我一直在想在 Django 编译 SQL 和执行它的数据库驱动程序之间发生了一些事情,但我不确定我什至会寻找什么,所以任何帮助表示赞赏。
根据 Gord Thompson 的评论,将 pyodbc 升级到 4.0.23 解决了这个问题。