【问题标题】:What datatype to use when storing metric data in SQL databases?在 SQL 数据库中存储指标数据时使用什么数据类型?
【发布时间】:2012-09-16 21:03:00
【问题描述】:

我正在尝试在 SQL Server 2012 中存储度量数据(米、公里、平方米)。

最好的数据类型是什么? float (C#: double), decimal (C#: decimal) 甚至 geometry?还是有什么不同?

【问题讨论】:

  • 您需要多少精度?
  • @Ren 我真的不知道。我的猜测是两个,因为“150,00 米”、“150 平方米”或“12,93 公里”的精度就足够了
  • 视情况而定......你打算如何处理这些数据?
  • @ColinMackay 不多。简单比较,(假设)“20 平方米
  • 在这里查看可以使用的不同可用数据类型 - i.stack.imgur.com/HKZCS.gif 不确定哪种最适合您的需求,因为我认为十进制,直到有人提到它很慢。

标签: c# sql-server sql-server-2012 sqldatatypes


【解决方案1】:

decimal 对您的数据具有适当的精度,或者 int 类型(如果适用)

【讨论】:

  • 小数对会计有好处,但长度和面积的公制单位?也许不是。特别是,如果您要使用三角函数。十进制非常慢,所以你应该只在绝对需要时才使用它。
  • "避免在 WHERE 子句搜索条件中使用浮点数或实数列,尤其是 =..." msdn.microsoft.com/en-us/library/ms187912(v=sql.105).aspx
  • 您是否有任何证据证明小数是“慢”的断言 - 我在 100,000 行表上没有看到任何差异。
  • 有各种文档指出十进制比纯形式的浮点慢。在 SQL Server 的上下文中,您可能认为差异可以忽略不计是对的,因为 SQL Server 花费更多的时间在内存或磁盘上拉取数据,而不是对其执行计算或比较。提问者还需要考虑它在 SQL Server 之外的使用,而不仅仅是它的存储。
【解决方案2】:

取决于你想做什么
float 或 double 是非精确数据类型(因此 5.0 == 5.0 由于舍入问题可能为假)
小数是一种精确的数据类型(因此 5.0 == 5.0 将始终为真)
和几何/地理(容易说)是用于地图上的位置。

浮点计算应该是这三者中最快的,因为地理是二进制数据,包含一些关于投影的信息(这里都是关于地图的信息)和十进制在技术上不像浮点那么容易处理。

【讨论】:

    【解决方案3】:

    这完全取决于应用程序以及您需要的精度。

    如果我们谈论的是架构,那么精度需求相对有限,C# 32-bit float 将带您走很长一段路。在 SQL 中,这转换为 float(24),也称为数据库类型 real。这种 SQL DB 类型每个条目需要 4 个字节的存储空间。

    如果我们想要定位地球表面上的点,则需要更高的精度。这里C# double 是合适的,它对应于SQL float(53) 或只是float。此 SQL DB 类型需要 8 个字节的存储空间,并且仅应在需要或应用程序较小且磁盘/内存使用量不是问题时才使用。

    SQL Decimal 可能是实际 SQL 数据库的一个很好的替代方案,但有两个缺点:

    1. 它对应于C# Decimal,这是一种专为金融用途和防止舍入错误而设计的类型。当在三角方法等中使用时,这种设计使 C# Decimal 类型比浮点/双精度类型更慢。您当然可以在代码中来回转换,但这不是 IMO 最直接的方法。

      “Decimal 值类型适用于需要大量有效整数和小数位数且无舍入错误的财务计算。” - MSDN : Decimal Structure

    2. SQL DB 类型 Decimal 每个条目需要 5-9 字节的存储空间(取决于使用的精度),这比 float(x) 替代方案要大。
    所以,根据你的需要使用它。在您的评论中,您声明它与房地产有关,所以我会选择 float(24)(又名 real),它正好是 4 个字节,直接转换为 C# float。见:float and real (Transact-SQL)

    最后,这里是在 .Net 和 SQL 之间转换不同类型的有用资源:SqlDbType Enumeration

    【讨论】:

    • 什么是 SQL 中的float 没有指定任何精度,为什么decimal 的精度不够?如果decimal 的精度低于float,它会不会快很多?
    • SQL 浮点数(在某种程度上)对应于 C# 双精度数。那就是它有相当高的进动。 SQL 中的 C# float 称为“real”,与“float(24)”相同。 SQL Decimal 对应于 C# Decimal,它专为金融需求而设计,比 C# double “慢”。
    • 什么是float 没有指定的pecision? float 的默认精度是多少?我的 SQL 列的类型为 float 而不是 float(24)
    • float 没有任何指定的精度等于 float(53) aka C# double。
    • 好的,所以对于房地产(平方米),您建议在 SQL 中使用 float(24)(或 real - 其中最常见?),从而使用 C# @ 987654346@,我说的对吗?
    猜你喜欢
    • 2010-11-14
    • 2015-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-03
    • 1970-01-01
    • 2020-12-21
    • 1970-01-01
    相关资源
    最近更新 更多