如果您看到Point data type的Microsoft SQL Server 2008 R2文档,则它希望将纬度和经度作为浮点数给出。
然而,this post on SO suggests that the better data type for storing long and lat is decimal(9,6)。
那么,为什么微软使用浮动?
更新 在下面的示例中,lat / long被非规范化以提高性能,我应该匹配点上的float数据类型,还是保持小数?
CREATE TABLE [dbo].[GeoTest](
[Id] [INT] IDENTITY(1,1) NOT NULL,
[Lat] [decimal](9, 6) NOT NULL,
[Long] [decimal](9, 6) NOT NULL,
[GeoPoint] [GEOGRAPHY] NOT NULL,
CONSTRAINT [PK_GeoTest] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
上面的架构允许我这样做:
SELECT Lat, Long FROM GeoTest WHERE GeoPoint.STDistance(GEOGRAPHY::Point(47.6475, -122.1393, 4326))/1609.344 <= 20
而不是:
SELECT GeoPoint.Lat, GeoPoint.Long FROM GeoTest WHERE GeoPoint.STDistance(GEOGRAPHY::Point(47.6475, -122.1393, 4326))/1609.344 <= 20
哪个更慢。令我感到奇怪的是,这两种数据类型不同。
答案 0 :(得分:0)
在内部,SQL Server使用http://download.microsoft.com/download/7/9/3/79326E29-1E2E-45EE-AA73-74043587B17D/%5BMS-SSCLRT%5D.pdf
文档中描述的格式存储几何和地理数据每个坐标值都被序列化为一个64位(8字节)长的双精度浮点值。因此,Point()方法的输入参数与此匹配是有意义的 - 即使用float数据类型。
正如@Pondlife指出的那样,你引用的另一篇文章与用于存储坐标值的通用数据类型有关,这是一个完全不同的问题。