在SQL数据库中存储度量数据时使用什么数据类型?

5

我正在尝试将度量数据(米,千米,平方米)存储在SQL Server 2012中。

什么是最好的数据类型?使用float(C#:double),decimal(C#:decimal)甚至是geometry?还是其他东西?


你需要多少精度? - Ren
@Ren 我其实不太确定。我猜可能是两个,因为“150米”、“150平方米”或“12.93公里”的精度已经足够了。 - SeToY
这要看情况……你打算用这些数据做什么? - Colin Mackay
@ColinMackay 没有太多。简单的比较,如“20平方米 <= 50平方米”。它主要用于基于房地产数据的应用程序中。 - SeToY
3
请查看这里提供的不同可用数据类型 - http://i.stack.imgur.com/HKZCS.gif。但我不确定哪种最适合您的需求,因为有人提到十进制很慢。 - Ren
显示剩余2条评论
3个回答

4

数据类型应该是decimal,要根据数据的特点选择合适的精度;如果可以的话,也可以考虑使用int类型。


2
十进制在会计方面很好,但长度和面积的公制单位呢?也许不是很好。特别是如果你要使用三角函数的话。十进制相当慢,所以只有在绝对需要时才应使用它。 - Colin Mackay
避免在 WHERE 子句的搜索条件中使用 float 或 real 列,特别是 = 运算符... http://msdn.microsoft.com/zh-cn/library/ms187912(v=sql.105).aspx - podiluska
你有任何证据支持十进制运算速度慢的说法吗?我在一个拥有10万行数据表上并没有看到任何差异。 - podiluska
1
有各种文件指出,十进制在其纯形式下比浮点数慢。在SQL Server的上下文中,您可能是正确的,因为SQL Server在比例上花费更多的时间将数据从内存或磁盘中提取出来,而不是对其执行计算或比较。提问者还需要考虑到它在SQL Server之外的使用情况,而不仅仅是它的存储。 - Colin Mackay

3
这完全取决于应用程序和所需的精度。如果我们谈论架构,那么精度要求相对较低,使用C# 32位浮点数将帮助你走得更远。在 SQL 中,它对应着float(24),也被称为数据库类型real。该SQL数据库类型每个条目需要4字节的存储空间。
如果我们想要处理地球表面上的点,就需要更高的精度。这里适合使用C# double,对应着SQL float(53)或只是float。该SQL数据库类型每个条目需要8字节的存储空间,在必要时使用或者应用程序很小且磁盘/内存使用不是一个问题。
SQL Decimal 可能是实际的SQL数据库的好选择,但有两个缺点:
它对应于C# Decimal,这是一种专为金融使用和防止舍入误差而设计的类型。这种设计使得C# Decimal类型在三角函数等方法中使用时比float/double慢。当然,您可以在代码中进行转换,但我认为这不是最直接的方法。
"Decimal值类型适用于需要大量有效整数和小数位以及无舍入误差的金融计算。"- MSDN : Decimal Structure
SQL DB类型Decimal每个条目需要5-9个字节的存储空间(取决于所使用的精度),这比float(x)替代品要大。因此,根据您的需求使用它。在您的评论中,您指出它与房地产有关,因此我会选择float(24)(也称为real),它恰好是4个字节,并直接转换为C# float。请参见:float and real (Transact-SQL)
最后,这是一个有用的资源,可以在 .Net 和 SQL 之间转换不同类型:SqlDbType 枚举

在SQL中,如果没有指定精度,float是什么意思?为什么decimal的精度不够?如果decimal的精度比float低,它会不会更快? - SeToY
SQL中的float(浮点数)与C#中的double(双精度浮点数)有一定的对应关系,即它具有相当高的精度。在SQL中,C# float被称为“real”(实数),这与“float(24)”是相同的。而SQL中的Decimal(十进制数)则对应C# Decimal,后者专门设计用于金融需求,比C# double要“慢”一些。 - Avada Kedavra
好的,那么对于房地产(平方米),你会建议在SQL中使用float(24)(或real - 它们哪个最常见?),因此在C#中使用float,对吗? - SeToY
是的,那将是我的选择。而且real有点被认为是老派的,所以我会使用float(24)。 - Avada Kedavra
好的,我认为这被视为一个完美的解决方案。谢谢你。我还会等待几个小时,并将您的回复标记为答案 :) - SeToY
显示剩余2条评论

1

这取决于您想要做什么
float或double是非精确数据类型(因此由于舍入问题,5.0 == 5.0可能为false)
Decimal是一种精确的数据类型(因此5.0 == 5.0将始终为true)
而几何/地理(简单说)是用于地图上的位置。

在三个中,浮点计算应该是最快的,因为地理信息是二进制数据,并带有有关投影的一些信息(这里涉及到地图),而十进制技术上不像浮点数那样易于处理。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接