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的链接