代码之家  ›  专栏  ›  技术社区  ›  alwayslearning

是否可以将System.Decimal.MinValue和System.Decimal.MinValue存储在sqlite中?

  •  1
  • alwayslearning  · 技术社区  · 16 年前

    考虑到sqlite支持的数据类型的最大大小是8个字节,我可以在数字列中存储decimal.minvalue、decimal.maxvalue吗?我用的是 ADO.NET provider 用于phxsoftware的sqlite。驱动程序是否在内部将值存储为字符串,并以两种方式进行转换?

    在尝试检索decimal.minvalue/maxvalue时,确实会得到System.OverflowException。

    1 回复  |  直到 16 年前
        1
  •  1
  •   Craig Trader    16 年前

    不,那个 System.Decimal 与sqlite 8字节整数(-9223372036854775808::9223372036854775808::9223372036854775807)相比,类型具有更广泛的值范围(-79228162514264337593543950335::792281625164337593543950335),并且需要比sqlite real更高的精度。( IEEE-754 )可以提供。

    http://www.sqlite.org/datatype3.html :

    具有数字相关性的列可以 包含使用全部五个存储的值 课程。插入文本数据时 在数字列中,存储 文本的类转换为 整数或实数(按 优先权)如果这种转换是 无损且可逆。为了 文本和实数之间的转换 存储类,sqlite考虑 转换为无损和 如果前15个显著 数字的小数位数为 保存。如果无损转换 文本转换为整数或实数不是 可能,然后存储该值 使用文本存储类。不 试图转换空值或 Blob值。

    一根绳子可能看起来像 带小数的浮点文字 点和/或指数符号,但作为 只要该值可以表示为 一个整数,数值关联将 将其转换为整数。因此, 字符串“3.0e+5”存储在列中 以数字相似性为整数 300000,不是作为浮点数 价值300000.0。

    如果你比较 -7.92281625142644e+28 -79,228,162,514,264,337,593,543,950,335 ,您将看到浮点值已四舍五入为一个超出System.Decimal可存储范围的值(-792281625142644000000000000)。您的ADO.NET提供程序正在尽其所能地做最好的工作,但是由于数据转换,它无法工作。如果您真的需要存储System.Decimal的整个范围,那么您将不得不将其存储为文本,并让自己无法在sqlite中对值进行操作。