如何将经纬度数据正确导入MySQL?

6

我有一个包含城市名称及其对应纬度/经度的数据集已加载到MySQL表中,如下所示:

city_id | city_name | 纬度 DECIMAL(9,6) | 经度 DECIMAL(9,6)

典型的纬度/经度坐标可能是这样的:54.284758 / 32.484736。

然而,我只能使精度为2的值在我的表格中正确显示,换句话说,相当于DECIMAL(5,2)。数据是从已导出为UTF-8格式的OpenOffice Calc文本CSV中上传的。我知道OpenOffice在小数方面存在一些问题,但完整的纬度/经度肯定在导出的CSV中。如果我用记事本打开CSV,数据就没问题。

有人能看出我做错了什么吗?

谢谢。

更新: 我搞定了,感谢所有的建议。我重新创建了所有内容,新的模式文件(我正在使用ORM),新的CSV导出,新的表格,新的LOAD DATA INFILE,现在可以正确输出小数了。真不知道原因何在。


当你在表格中说“不正确”时,是指在MySQL提示符下键入“SELECT * FROM mytable”吗?还是你有一个查看器? - James Cronen
@Tenner.... 我正在使用MySQL Workbench,但是当我通过PHP提取一个坐标时,结果是一样的。 - Tom
考虑到数据类型为“DECIMAL(9,6)”,并且在记事本中查看CSV文件时正确无误,那么你用来导入数据的工具可能存在问题。建议尝试使用MySQL LOAD DATA INFILE命令导入数据,以避免遇到任何问题:http://dev.mysql.com/doc/refman/5.1/en/load-data.html - OMG Ponies
@OMG Ponies...谢谢,我正在使用LOAD DATA INFILE导入CSV。我再次查看了语法,但没有看到任何应该影响它的东西。有SET子句,但我必须承认我不太理解它。 - Tom
3个回答

5
这可能超出了您的需求范围,但在处理地理数据时,您可能需要考虑使用MySQL空间扩展
我想补充的是,您目前使用的数据类型足以表示CSV文件中的数据。可能是导入程序在导入时截断了它,或者您用于查看数据的工具将其截断了。

不确定这个链接引用的是什么...但是空间扩展似乎不存在...这是来自8.0的更新参考文献。 https://dev.mysql.com/doc/refman/8.0/en/spatial-types.html - Michael Parisi

1

我建议使用字符串数据类型,如 varchar 来存储纬度和经度。我正在开发一个应用程序,并广泛使用这些坐标,将其作为字符串存储没有遇到任何问题。如果将其作为数字存储,则会遇到精度问题。

这是考虑的一个方面。


谢谢Lukasz。你所说的精度问题是什么意思?我不会以非常严格的方式使用数据,只是用它来生成一些Google地图坐标和小应用程序。我认为6的比例相当准确,你觉得呢? - Tom
2
你如何进行排序?或者在半径范围内搜索?将它们存储为字符串似乎会导致很多不必要的运行时转换。 - James Cronen
就精度而言,我建议使用字符串或足够大的十进制数。例如,使用浮点数可能会发生以下情况。我从必应地图返回了这个坐标43.371240452765925,将该值存储为浮点数会导致43.3712404527659。这不是一个很大的误差,但确实存在误差。至于排序,T-SQL使用字典顺序进行排序,这意味着字符串和数字将以类似的方式进行排序,因此无需转换。 - Lukasz

0
为什么不在你的MySQL表中将字段声明为DOUBLE类型?数字位数和小数点后的位数限定符是可选的。

谢谢,我一会儿就试试,但正如MySQL手册所说,当需要精确度时,DOUBLE/FLOAT不是正确的格式,而DECIMAL是。 - Tom

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