SQL Server中经度/纬度值的数据库存储:十进制(2,?)

SQL Server中经度/纬度值的数据库存储:十进制(2,?),sql,sql-server,types,geocoding,Sql,Sql Server,Types,Geocoding,在表定义中,我看到: Latitude -> varchar(50) Longitude -> nvarchar(50) 很明显,我立刻质疑了这背后的想法——肯定这些值实际上是数字。长话短说:我假设这些将是数字的,实际上是十进制的,我们将抛弃“用字符串思考”的哲学 现在,对于我的困境,我只是继续输入: Latitude -> decimal(2, 4) 但是等一下,4不对,对吗?正确的。因此,我想在意识到(在一瞬间我可以加上)6或8也可

在表定义中,我看到:

Latitude     ->    varchar(50)
Longitude    ->    nvarchar(50)
很明显,我立刻质疑了这背后的想法——肯定这些值实际上是数字。长话短说:我假设这些将是数字的,实际上是十进制的,我们将抛弃“用字符串思考”的哲学

现在,对于我的困境,我只是继续输入:

Latitude    ->    decimal(2, 4)
但是等一下,
4
不对,对吗?正确的。因此,我想在意识到(在一瞬间我可以加上)
6
8
也可能无法削减之前,我应该提高阈值。所以,首先要做的是

我坚持我们这样做对吗?如果是的话

这些值应该存储到什么样的精度,以确保我们可以持久化要插入的整个值?例如,规范是否预定义了任何内容

我不想使用像
Latitude->decimal(2,16)
这样的东西,只是为了让它在原则上和
decimal(2,2)
一样有缺陷。对于经度,也有一个类似的问题,但我假设一个的答案对于另一个就足够了,即
decimal(3,答案)

我们正在使用MSSQL Server 2005


看来我是在用手工的经验来学习SQL Server,因此这个问题的某些部分变得无关紧要:我只能使用
decimal(x,max(x))
而不是
decimal(x,y)
!将问题保留为输入。

sql server中小数的最大精度目前为38。刻度可高达38。在最大值时,十进制将占用17位,其中作为varchar,将占用任何长度加2。因此,如果使用varchar(38),在最大值时,将占用40位数据。另一方面,varchar的大小并不像十进制那样有限。所以,您真正需要做的是计算出允许多少小数点,然后计算出它的数据类型

十进制(2,4)表示精度总计2位,小数点后4位。SQL Server不允许您这样做,但我认为这意味着您可以存储-0.0099到0.0099之间的值


我推荐十进制(9,6)。这将在赤道处以大约1/6英寸的精度存储。使用9或更少,因为精度需要5字节的存储空间,使用10-19需要9字节。

您使用的是哪个版本的SQL Server?2008为笛卡尔和椭球场景内置了一些本地地理空间类型。它们分别称为几何和地理。然后使用十进制类型,参见Cade Roux的链接