考虑到SQLite支持的数据类型的最大大小是8个字节,我可以在NUMERIC列中存储Decimal.MinValue,Decimal.MaxValue。我通过phxsoftware将ADO.NET provider用于SQLite。驱动程序是否在内部将值存储为字符串并进行双向转换?
我在尝试检索Decimal.MinValue / MaxValue时遇到System.OverflowException。
答案 0 :(得分:1)
没有。 System.Decimal类型具有比SQLite 8字节INTEGER(-9,223,372,036,854,775,808 :: 9,223,372,036,854,775,807)更宽范围的值(-79,228,162,514,264,337,593,543,950,335 :: 79,228,162,514,264,337,593,543,950,335),并且需要比SQLite REAL(IEEE-754)更高的精度。可以提供。
来自http://www.sqlite.org/datatype3.html:
具有NUMERIC亲和力的列可以 包含使用所有五个存储的值 类。插入文本数据时 进入NUMERIC列,存储 文本的类被转换为 INTEGER或REAL(按顺序) (如果有这样的转换) 无损且可逆。对于 TEXT和REAL之间的转换 存储类,SQLite认为 转换为无损和 如果前15个重要可逆 数字的十进制数字是 保存。如果无损转换 TEXT到INTEGER或REAL不是 可能然后存储该值 使用TEXT存储类。没有 尝试转换NULL或 BLOB值。
字符串可能看起来像 带小数的浮点字面值 点和/或指数表示法,但为 只要该值可以表示为 一个整数,NUMERIC亲和力 将其转换为整数。因此, 字符串'3.0e + 5'存储在一列中 以NUMERIC affinity为整数 300000,不作为浮点 价值300000.0。
如果将-7.92281625142644e+28
与-79,228,162,514,264,337,593,543,950,335
进行比较,您会看到浮点值已向下舍入为超出System.Decimal可存储范围的值(-79,228,162,514,264,400,000,000,000,000) 。您的ADO.NET提供商正在尽最大努力,但由于数据转换,它将无法正常工作。如果你真的需要存储System.Decimal的全部范围,那么你将不得不将它存储为文本,并让自己不能在SQLite中作为数字操作值。