经纬度MySQL字段类型

4

我有一组大量的纬度和经度需要存储在MySQL数据库中。对于使用的字段类型,我在阅读时得到了不同的建议。

数据示例如下...

Lat        |  Long
------------------------
53.670827  |  -1.093991
50.894701  |  0.061115
52.288213  |  -1.822060

根据 Google 的这份文档,他们建议使用 FLOAT(10,6) 作为字段类型。
我试过了,输入 57.098554 时它变成了 57.098553,而输入 -2.252504 则正确存储。
作为替代方案,我打算使用以下方法...
Lat DECIMAL(10, 8)
Long DECIMAL(11,8)

有没有更好的建议,或者我的DECIMAL设置是正确的?

使用int?插入时将每个值乘以10^6? - pintxo
浮点数以近似值存储数据,它有上限和下限。此外,为了存储“lat”和“lng”,您应该使用螺旋扩展 http://dev.mysql.com/doc/refman/5.7/en/spatial-extensions.html - Abhik Chakraborty
我之前也遇到过同样的问题,并且通过像你一样使用小数来解决它 - 如果你碰巧使用Doctrine,这里有一个详细的示例来实现此操作: http://intelligentbee.com/blog/2015/04/10/how-to-store-latitude-and-longitude-in-mysql/ - Sebastian
2个回答

4
两者都是错误的!您提供的谷歌文档是2009年的,自那时以来mysql已经发展了很长一段时间。特别是在mysql 5.7中引入了JSON和等待它.... 空间数据类型。
自从引入以来,存储位置的正确方法是作为POINT字段。这也为您打开了一系列空间数据函数。在其引入之前,开发人员必须手动编写这些函数。
内置的地理空间函数能够使用索引,而自制函数通常速度较慢,因为无法充分利用索引。

谢谢!我没有注意到那篇Google文章的日期以及它的陈旧程度。现在只是看POINT。 - fightstarr20
如果我还想存储原始的分离的经度和纬度字段,那么上面的 DECIMAL 字段类型是否合适? - fightstarr20
不需要,这会是冗余的。从POINT类型中很容易获取Lat和Lng。 - e4c5
如果我有将它们存储为两个单独字段的要求,那么这并不是冗余的。 - fightstarr20
它仍然是冗余的。因为你在保存相同的数据两次。将纬度和经度保存为两个单独的字段是一种过时的做法。 - e4c5

-1

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