请记住,我将在lat / long对上执行计算,什么数据类型最适合与MySQL数据库一起使用?
当前回答
FLOAT应该能给你所需的所有精度,并且比将每个坐标存储为字符串或类似的东西更好地用于比较函数。
如果你的MySQL版本低于5.0.3,你可能需要注意某些浮点比较错误。
在MySQL 5.0.3之前,DECIMAL列以精确的精度存储值,因为它们是用字符串表示的,但DECIMAL值的计算是使用浮点操作完成的。从5.0.3开始,MySQL执行DECIMAL操作的精度为64位十进制数字,这应该可以解决DECIMAL列最常见的不准确问题
其他回答
我建议您使用浮动数据类型的SQL Server。
MySQL使用double为所有浮点数… 所以使用double类型。在大多数情况下,使用float会导致不可预测的四舍五入值
存储Lat Long值的理想数据类型是十进制(9,6)
这是在大约10cm的精度,而只使用5字节的存储。
例如:CAST(123.456789 as decimal(9,6))
博士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位)
GeoLocationCoordinates返回一个双数据类型,以十进制表示位置的经纬度。你可以试着用double。
推荐文章
- 我如何得到“id”后插入到MySQL数据库与Python?
- 实现嵌套字典的最佳方法是什么?
- MySQL工作台:如何保持连接活动
- 'create_date'时间戳字段的默认值无效
- 我可以从一个完整的mysql mysqldump文件恢复一个表吗?
- 计数在VARCHAR字段中字符串的出现次数?
- 修改一个MySQL列为AUTO_INCREMENT
- 在ROR迁移期间,将列类型从Date更改为DateTime
- 如何删除所有MySQL表从命令行没有DROP数据库权限?
- 从主机连接到docker容器中的mysql
- 如果任何字段包含NULL, MySQL CONCAT将返回NULL
- MySQL中的字符串连接
- Laravel未知列'updated_at'
- MySQL更新内部连接表查询
- 根据查询结果设置用户变量