考虑到我将对纬度/经度对执行计算,哪种数据类型最适合与MySQL数据库一起使用?
考虑到我将对纬度/经度对执行计算,哪种数据类型最适合与MySQL数据库一起使用?
基本上这取决于您对位置精度的需求。使用DOUBLE,您将具有3.5纳米的精度。DECIMAL(8,6)/(9,6)可降至16厘米。FLOAT为1.7m...
这个非常有趣的表格有一个更完整的列表: http://mysql.rjweb.org/doc.php/latlng:
Datatype Bytes Resolution
Deg*100 (SMALLINT) 4 1570 m 1.0 mi Cities
DECIMAL(4,2)/(5,2) 5 1570 m 1.0 mi Cities
SMALLINT scaled 4 682 m 0.4 mi Cities
Deg*10000 (MEDIUMINT) 6 16 m 52 ft Houses/Businesses
DECIMAL(6,4)/(7,4) 7 16 m 52 ft Houses/Businesses
MEDIUMINT scaled 6 2.7 m 8.8 ft
FLOAT 8 1.7 m 5.6 ft
DECIMAL(8,6)/(9,6) 9 16cm 1/2 ft Friends in a mall
Deg*10000000 (INT) 8 16mm 5/8 in Marbles
DOUBLE 16 3.5nm ... Fleas on a dog
2 doubles == 16 bytes
)。 - JakeStrang使用MySQL的空间扩展功能与GIS一起使用。
谷歌提供了一个针对“门店定位器”应用程序的PHP/MySQL全流程解决方案,其中包括Google Maps。在这个例子中,他们将lat/lng值存储为“10,6”长度的“Float”类型。
Double
。 - FooBarMySQL的空间扩展是最好的选择,因为您可以使用完整的空间操作符和索引列表。空间索引将允许您快速执行基于距离的计算。请记住,截至6.0版本,空间扩展仍然不完整。我不是贬低MySQL空间,只是在您深入研究之前告诉您存在的缺陷。
如果您只处理点并且仅需要DISTANCE函数,则这很好。如果您需要对多边形、线或缓冲点进行任何计算,则除非使用“relate”操作符,否则空间操作符将无法提供精确的结果。请参见21.5.6的顶部警告。例如,包含、包含在内或相交等关系正在使用MBR,而不是准确的几何形状(即椭圆被视为矩形)。
此外,在MySQL空间中,距离与您的第一个几何图形使用相同的单位。这意味着,如果您使用十进制度数,则距离测量值也以十进制度数表示。随着您远离赤道,这将使获得精确结果变得非常困难。
ST_Distance_Sphere
来精确实现这一功能。 - Ecuadora*b
不等于b*a
(对于某些值)。还有许多类似的例子:2+2=3.9999
。该标准清理了很多混乱,并且被几乎所有硬件和软件“迅速”采用。因此,这个讨论不仅在2008年以后有效,而且已经持续了三分之一个世纪。 - Rick James取决于您所需的精度。
Datatype Bytes resolution
------------------ ----- --------------------------------
Deg*100 (SMALLINT) 4 1570 m 1.0 mi Cities
DECIMAL(4,2)/(5,2) 5 1570 m 1.0 mi Cities
SMALLINT scaled 4 682 m 0.4 mi Cities
Deg*10000 (MEDIUMINT) 6 16 m 52 ft Houses/Businesses
DECIMAL(6,4)/(7,4) 7 16 m 52 ft Houses/Businesses
MEDIUMINT scaled 6 2.7 m 8.8 ft
FLOAT 8 1.7 m 5.6 ft
DECIMAL(8,6)/(9,6) 9 16cm 1/2 ft Friends in a mall
Deg*10000000 (INT) 8 16mm 5/8 in Marbles
DOUBLE 16 3.5nm ... Fleas on a dog
来源: http://mysql.rjweb.org/doc.php/latlng
总结:
DOUBLE
。DECIMAL(8,6)/(9,6)
。从 MySQL 5.7 开始,考虑使用空间数据类型(SDT),特别是 POINT
存储单个坐标。在5.7之前,SDT不支持索引(5.6表类型为MyISAM除外)。
注意:
POINT
类时,存储坐标的参数顺序必须是POINT(latitude, longitude)
。ST_Distance
)和确定一个点是否包含在另一个区域内(ST_Contains
)。CREATE TABLE geom (g GEOMETRY NOT NULL, SPATIAL INDEX(g)) ENGINE=MyISAM;
以及关于SDT限制的警告,就像James提到的那样,也许你的答案将更加简明扼要,帮助其他人。 - ArmfootPOINT()
将 X 和 Y 存储在 DOUBLE
中。这一点可以通过 POINT
的大小进一步证实。与跳蚤说再见! - Rick James使用 DECIMAL(8,6)
存储纬度(90 到 -90 度)和 DECIMAL(9,6)
存储经度(180 到 -180 度),大多数应用程序六位小数精度足够。两者应该是“有符号的”以支持负值。
DECIMAL
类型用于金融计算,不接受 floor/ceil
。普通的 FLOAT
明显比 DECIMAL
更高效。 - Kondybas无需走得太远,根据Google地图,最佳的经纬度精度为FLOAT(10,6)。
lat FLOAT( 10, 6 ) NOT NULL,
和 lng FLOAT( 10, 6 ) NOT NULL
。 - turrican_34MYSQL 8.0.17
已经将FLOAT
语法废弃。现在Mysql建议只使用无精度参数的FLOAT
https://dev.mysql.com/doc/refman/8.0/en/numeric-type-overview.html和https://dev.mysql.com/doc/refman/5.5/en/floating-point-types.html - turrican_34为避免使用双精度数时出现的四舍五入误差,我们将纬度/经度乘以1,000,000后存储为数字类型在我们的Oracle数据库中。
因为纬度/经度到小数点后第6位已经具有10厘米的准确度,这已经足够我们的需求。许多其他数据库也将纬度/经度存储到小数点后第6位。
DECIMAL(9.6)
被 精确地 存储。正常的读写操作不会 损坏 值。 - Rick James