当存储纬度或经度数据在ANSI SQL兼容的数据库,什么数据类型将是最合适的?应该用浮点数,还是十进制,还是…?
我知道Oracle、MySql和SQL Server已经添加了一些专门用于处理地理数据的特殊数据类型,但我感兴趣的是如何将信息存储在“普通”SQL数据库中。
当存储纬度或经度数据在ANSI SQL兼容的数据库,什么数据类型将是最合适的?应该用浮点数,还是十进制,还是…?
我知道Oracle、MySql和SQL Server已经添加了一些专门用于处理地理数据的特殊数据类型,但我感兴趣的是如何将信息存储在“普通”SQL数据库中。
当前回答
在普通的Oracle中,被称为LOCATOR (Spatial的一个残缺版本)的特性要求使用NUMBER(没有精度)数据类型存储坐标数据。当你试图创建基于函数的索引来支持空间查询时,它会卡住。
其他回答
好吧,你问如何存储纬度/经度,我的回答是:不要,你可以考虑使用WGS 84(在欧洲ETRS 89),因为它是地理参考的标准。
但是在SQL 2008最终包含地理位置支持之前,我使用了一个用户定义类型。
在普通的Oracle中,被称为LOCATOR (Spatial的一个残缺版本)的特性要求使用NUMBER(没有精度)数据类型存储坐标数据。当你试图创建基于函数的索引来支持空间查询时,它会卡住。
对于纬度使用:Decimal(8,6),经度使用:Decimal(9,6)
如果你不习惯使用精度和缩放参数,这里有一个可视的格式字符串:
经纬度 # #。######和###.######
小数点后6位可以让你在坐标上得到大约10厘米的精度。
您应该看看SQL Server 2008中引入的新的空间数据类型。他们是专门设计这类任务,使索引和查询数据更容易和更有效。
http://msdn.microsoft.com/en-us/library/bb933876 (v = sql.105) . aspx
我认为这取决于你最经常需要做的手术。
如果需要完整的值作为十进制数,则使用具有适当精度和比例的十进制。我相信你的需求远远不够。
如果你经常要转换为度ºmin'sec”分数符号,我会考虑将每个值存储为整数类型(smallint, tinyint, tinyint, smallint?)