在ANSI SQL兼容数据库中存储纬度或经度数据时,哪种数据类型最合适?应该使用float
,还是decimal
,或......?
我知道Oracle,MySql和SQL Server已经添加了一些专门用于处理地理数据的特殊数据类型,但我对如何将信息存储在“普通的”SQL数据库中感兴趣。
答案 0 :(得分:401)
Decimal(9,6)
如果你不熟悉精度和比例参数,这里有一个格式字符串visual:
###.######
答案 1 :(得分:6)
我们使用float,但任何带小数点后6位的数字风格也应该有用。
答案 2 :(得分:3)
嗯,您问过如何存储纬度/经度,我的回答是:不要,您可以考虑使用WGS 84(在欧洲ETRS 89),因为它是地理参考的标准。
但除了那个细节,我在SQL 2008之前的几天使用了用户定义类型,最后还包括地理支持。
答案 3 :(得分:2)
在vanilla Oracle中,名为LOCATOR(Spatial的残缺版本)的功能要求使用NUMBER(无精度)数据类型存储坐标数据。当您尝试创建基于函数的索引以支持空间查询时,否则会窒息。
答案 4 :(得分:2)
您可以轻松地将lat / lon十进制数存储在无符号整数字段中,而不是将它们拆分为整数和小数部分,并使用以下转换算法单独存储这些数字:
作为存储的mysql函数:
CREATE DEFINER=`r`@`l` FUNCTION `PositionSmallToFloat`(s INT)
RETURNS decimal(10,7)
DETERMINISTIC
RETURN if( ((s > 0) && (s >> 31)) , (-(0x7FFFFFFF -
(s & 0x7FFFFFFF))) / 600000, s / 600000)
并返回
CREATE DEFINER=`r`@`l` FUNCTION `PositionFloatToSmall`(s DECIMAL(10,7))
RETURNS int(10)
DETERMINISTIC
RETURN s * 600000
需要存储在 unsigned int(10)中,这适用于mysql以及无类型的sqlite。
通过经验,我发现这个工作真的很快,如果您需要的只是存储坐标并检索那些用于进行数学运算的那些。
在php中,这两个函数看起来像function LatitudeSmallToFloat($LatitudeSmall){
if(($LatitudeSmall>0)&&($LatitudeSmall>>31))
$LatitudeSmall=-(0x7FFFFFFF-($LatitudeSmall&0x7FFFFFFF))-1;
return (float)$LatitudeSmall/(float)600000;
}
然后又回来了:
function LatitudeFloatToSmall($LatitudeFloat){
$Latitude=round((float)$LatitudeFloat*(float)600000);
if($Latitude<0) $Latitude+=0xFFFFFFFF;
return $Latitude;
}
在创建例如带整数的memcached唯一键方面,这也有一些额外的优势。 (例如:缓存地理编码结果)。希望这为讨论增添了价值。
另一个应用程序可能是当你没有GIS扩展并且只想保留几百万个lat / lon对时,你可以在mysql中的那些字段上使用分区以从它们是整数的事实中受益:
Create Table: CREATE TABLE `Locations` (
`lat` int(10) unsigned NOT NULL,
`lon` int(10) unsigned NOT NULL,
`location` text,
PRIMARY KEY (`lat`,`lon`) USING BTREE,
KEY `index_location` (`locationText`(30))
) ENGINE=InnoDB DEFAULT CHARSET=utf8
/*!50100 PARTITION BY KEY ()
PARTITIONS 100 */
答案 5 :(得分:1)
我会使用具有适当精确度的十进制数据。
答案 6 :(得分:1)
我认为这取决于您最常需要做的操作。
如果您需要十进制数的完整值,请使用具有适当精度和比例的十进制数。我相信浮动超出了你的需求。
如果您经常转换为/ degranmin'sec“分数表示法,我会考虑将每个值存储为整数类型(smallint,tinyint,tinyint,smallint?)。
答案 7 :(得分:1)
您应该看一下SQL Server 2008中引入的新的Spatial数据类型。它们专门设计了这种任务,使索引和查询数据更加容易和高效。
http://msdn.microsoft.com/en-us/library/bb933876(v=sql.105).aspx
http://blogs.technet.com/andrew/archive/2007/11/26/sql-server-2008-spatial-data-types.aspx