在MySQL数据库中存储纬度/经度时,使用哪种数据类型最理想?

494

考虑到我将对纬度/经度对执行计算,哪种数据类型最适合与MySQL数据库一起使用?


1
我发现这个链接非常有用:http://howto-use-mysql-spatial-ext.blogspot.com/2007/11/using-circular-area-selection.html。虽然它可能有点老,但它包含了完整的解释和示例。 - madc
续:当将数字作为外部来源的未更改且第一次的源材料存储时,保留6位小数可能是可以的。但是,如果对其进行一次计算,然后再次存储它,通过强制使用特定的小数格式来删除部分精度是“愚蠢的”。仅在服务器内执行计算可能会有所不同(服务器可能正在使用比双精度更好的数字表示),而在应用程序计算中使用比双精度更糟糕的数字表示当然会降低存储精度的需求。 - Stormwind
1
最后:对于纬度和经度,第六位小数点差距只有约11厘米。每次读取(触摸)、计算并再次存储时,如果使用6位小数,将会产生新的差距(累积误差)。如果所有误差恰好朝着同一个方向发生,那么就会出现误差。如果在其上进行临时乘法(例如,放大、然后减去和缩小),误差可能会变得更大。没有充分的理由不要弃用精度! - Stormwind
(在MySQL中,至少)DECIMAL(9.6)精确地 存储。正常的读写操作不会 损坏 值。 - Rick James
@ToolmakerSteve - 我承认我很多疑。对我来说,“可能”几乎等同于“不可避免”。例如:缓冲区溢出从未被设计,但我们已经看到了它们40年,因为它们是可能的。但请注意:原始问题说“执行计算”,这是一个非常笼统的陈述。我们不知道它的含义。对我来说,可能会有多个数据库读写操作。如果它在60%的写入时向西(在11厘米网格中),并且在40%的写入时向东...(无论CPU有多精确),而您这样做1000次...为什么要邀请这种情况呢?没有关系,你的说法也是正确的-这取决于情况! :-) - Stormwind
显示剩余11条评论
22个回答

-2

经纬度计算需要精确性,因此使用某种十进制类型并使精度至少比您将存储的数字高2以执行数学计算。我不知道我的SQL数据类型,但在SQL服务器中,人们经常使用浮点或实数而不是小数,并陷入麻烦,因为这些是估计数字而不是真实数字。因此,请确保您使用的数据类型是真正的小数类型而不是浮动小数类型,那么您就应该没问题了。


1
浮点型和十进制型都有它们的用途。一般来说,浮点型表示物理变量,而十进制型则用于可计数实体(主要是货币)。我不明白为什么你会更喜欢在经纬度上使用十进制型。 - Javier
1
我认为在 SQL Server 上使用 float 类型来存储经纬度是可以的,至少它占用 4 字节,可以存储 7 位数字。 - Dragoljub Ćurčić
浮点数并非精确值,而是估算值,在纬度和经度上的不精确会导致灾难性后果!它可能指向地球上完全不同的位置。 - HLGEM
2
浮点数据类型的最大误差足够小,这不应该是一个问题。我的意思是,你必须注意两种实现中的误差乘积/累加。 - Spidey
@HLGEM - 将数字舍入到某个小数位数也会使你落在地球上的不同位置。问题是这个不同的位置是否如此接近,以至于它并不重要。 - Rick James

-4

一个浮点数应该给你所有你需要的精度,并且比将每个坐标存储为字符串或类似物更适合比较函数。

如果你的MySQL版本早于5.0.3,你可能需要注意某些浮点数比较错误

在MySQL 5.0.3之前,DECIMAL列以精确的精度存储值,因为它们被表示为字符串,但是对DECIMAL值的计算使用浮点运算。从5.0.3开始,MySQL使用64位小数的精度执行DECIMAL操作,这应该解决大多数关于DECIMAL列的常见不准确问题


2
你需要一个真正的纬度/经度坐标数据类型来进行简单的数学计算。想象一下,如果有类似于“select * from stores where distance(stores.location, mylocation) < 5 miles”的便利性会是多么的方便。 - Kirk Strauser
1
之前没有听说过空间扩展,这听起来确实非常方便。之前曾经在一个继承的应用程序上工作过,它执行了相当多的地理相关计算,我一定要去看看。 - ConroyP
@ConroyP - 不是的。这句话指出 DECIMAL 在 5.0.3 之前由于使用浮点实现而存在某些错误。 - Rick James

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接