请记住,我将在lat / long对上执行计算,什么数据类型最适合与MySQL数据库一起使用?
当前回答
谷歌提供了一个从开始到结束的PHP/MySQL解决方案的例子“商店定位器”应用程序与谷歌地图。在本例中,它们将lat/lng值存储为“Float”,长度为“10,6”
http://code.google.com/apis/maps/articles/phpsqlsearch.html
其他回答
存储Lat Long值的理想数据类型是十进制(9,6)
这是在大约10cm的精度,而只使用5字节的存储。
例如:CAST(123.456789 as decimal(9,6))
从一个完全不同和简单的角度来看:
if you are relying on Google for showing your maps, markers, polygons, whatever, then let the calculations be done by Google! you save resources on your server and you simply store the latitude and longitude together as a single string (VARCHAR), E.g.: "-0000.0000001,-0000.000000000000001" (35 length and if a number has more than 7 decimal digits then it gets rounded); if Google returns more than 7 decimal digits per number, you can get that data stored in your string anyway, just in case you want to detect some flees or microbes in the future; you can use their distance matrix or their geometry library for calculating distances or detecting points in certain areas with calls as simple as this: google.maps.geometry.poly.containsLocation(latLng, bermudaTrianglePolygon)) there are plenty of "server-side" APIs you can use (in Python, Ruby on Rails, PHP, CodeIgniter, Laravel, Yii, Zend Framework, etc.) that use Google Maps API.
这样,您就不必担心索引号和与数据类型相关的所有其他问题,这些问题可能会破坏您的坐标。
使用DECIMAL(8,6)表示纬度(90到-90度),使用DECIMAL(9,6)表示经度(180到-180度)。小数点后6位对于大多数应用程序都是可以的。两者都应该“有符号”以允许为负值。
MySQL使用double为所有浮点数… 所以使用double类型。在大多数情况下,使用float会导致不可预测的四舍五入值
博士TL;
如果你不是在NASA /军队工作,也不是制造飞机导航系统,请使用FLOAT(8,5)。
要完整地回答你的问题,你需要考虑以下几点:
格式
度分秒:40°26′46″N 79°58′56″W 十进制分:北纬40°26.767′,西经79°58.933′ 十进制度数1:40 .446°N 79.982°W 十进制度数2:-32.60875,21.27812 其他的自制格式?没有人禁止你制作自己的以家庭为中心的坐标系统,并将其存储为标题和离家的距离。对于您正在处理的某些特定问题,这可能是有意义的。
因此,答案的第一部分将是-您可以以应用程序使用的格式存储坐标,以避免常量来回转换,并进行更简单的SQL查询。
大多数情况下,您使用谷歌Maps或OSM来显示数据,而gmap使用“十进制2”格式。所以用相同的格式存储坐标会更容易。
精度
然后,您需要定义所需的精度。当然,您可以存储诸如“-32.608697550570334,21.278081997935146”这样的坐标,但在导航到点时,您是否关心过毫米?如果你不是在NASA工作,也不是在研究卫星、火箭或飞机的轨迹,你应该可以接受几米的精度。
常用的格式是圆点后面加5位数字,这样可以得到50cm的精度。
例如:X 21.2780818与X 21.2780819之间有1cm的距离。所以点号后面有7个数字可以得到1/2cm的精度,点号后面有5个数字可以得到1/2米的精度(因为不同点之间的最小距离是1m,所以舍入误差不能超过它的一半)。对于大多数民用目的来说,这应该足够了。
度十进制分钟格式(40°26.767′N 79°58.933′W)的精度与点后5位数字完全相同
空间存储
如果您选择了十进制格式,那么您的坐标是一对(-32.60875,21.27812)。显然,2 x(1位表示符号,2位表示度,5位表示指数)就足够了。
So here I'd like to support Alix Axel from comments saying that Google suggestion to store it in FLOAT(10,6) is really extra, because you don't need 4 digits for main part (since sign is separated and latitude is limited to 90 and longitude is limited to 180). You can easily use FLOAT(8,5) for 1/2m precision or FLOAT(9,6) for 50/2cm precision. Or you can even store lat and long in separated types, because FLOAT(7,5) is enough for lat. See MySQL float types reference. Any of them will be like normal FLOAT and equal to 4 bytes anyway.
通常空间现在不是一个问题,但如果你想真正优化存储出于某些原因(免责声明:不做预优化),你可以压缩lat(不超过91000个值+符号)+ long(不超过181 000个值+符号)到21位,这明显小于2xFLOAT(8字节== 64位)
推荐文章
- 警告用户/local/mysql/data目录不属于mysql用户
- 添加一个复合主键
- 无法添加或更新子行:外键约束失败
- 如何从本地机器mysqldump远程数据库
- 如何正确地创建复合主键- MYSQL
- 仅在Datetime列上按日期分组
- 在MySQL数据库中存储货币值的最佳数据类型
- 如何自定义'显示进程列表'在mysql?
- 多语言数据库设计的最佳实践是什么?
- MySQL删除一些外键
- 用MySQL LEFT JOIN删除行
- MySQL - length() vs char_length()
- 使用PDO进行行计数
- 在Mac上安装MySQL后,使用ALTER USER语句重置MySQL root密码
- my.cnf文件在macOS上的位置