在MySQL数据库中存储纬度和经度数值的问题

17

我想将从Google Maps GeoCoding API获取的纬度和经度值存储在MySQL数据库中,这些值以浮点格式表示。

12.9274529

77.5905970

但当我想要将其存储到数据库中(数据类型为float)时,它会将浮点数四舍五入并以以下格式存储:

12.9275

77.5906

我是否使用了错误的数据类型?如果是,则应该使用什么数据类型来存储纬度和经度值?

更新:

这是Allin要求的CREATE TABLE语句:

CREATE TABLE `properties` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(100) NOT NULL,
  `description` text,
  `latitude` float DEFAULT NULL,
  `longitude` float DEFAULT NULL,
  `landmark` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `serial` (`serial`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;

3
你曾经尝试过其他数据类型吗? - jezmck
@Ibrahim Azhar Armar,您能执行SHOW CREATE TABLE或其他操作,并告诉我们数据类型是什么吗? - Alin Purcaru
@Alin Purcaru,就像我之前说的一样,它是浮点数。 - Ibrahim Azhar Armar
@Ibrahim Azhar Armar 我只是想确保您实际使用了 FLOAT 数据类型。 - Alin Purcaru
显示剩余3条评论
7个回答

40

如果您不希望数字被近似,请使用DECIMAL

定点数(精确值)类型

DECIMAL和NUMERIC类型存储精确数值数据。这些类型用于保留精确度十分重要的场合,例如货币数据。

现在给你一个答案:

使用DECIMAL(10,7)。其中10是数字中的总位数,7.后面的数字位数。(这意味着小数点前将有3个数字。)

根据需要调整这些数字。此外,请务必查看我在答案中链接的手册条目。


在测试和尝试了float、double和decimal之后,我觉得使用DECIMAL更为相关。谢谢 :) - Ibrahim Azhar Armar
1
我的回答是一个双精度浮点数,得到了更多的赞同(+6)和反对(-3) - 人们对此有着复杂的感受。我认为这一切都归结于优先级,但在这种情况下可能没有太大的区别,两者都完全适合任务。不过这是一个有趣的话题,很好的机会来讨论这个问题。 - Billy Moon

8
MySQL有专门用于GIS应用的特殊类型。使用point类型,参见:http://dev.mysql.com/doc/refman/5.0/en/spatial-extensions.html。关于一般讨论,请参见:http://dev.mysql.com/tech-resources/articles/4.1/gis-with-mysql.html。一些人为计算球面上(即地球)两点之间距离制作了一个特殊的UDF,请参见:http://www.lenzg.net/archives/220-New-UDF-for-MySQL-5.1-provides-GIS-functions-distance_sphere-and-distance_spheroid.html。以下是一个如何操作的指南:http://howto-use-mysql-spatial-ext.blogspot.com/2007/11/using-circular-area-selection.html

http://howto-use-mysql-spatial-ext.blogspot.com/2007/11/using-circular-area-selection.html - Johan

7

使用 double

float缺乏足够的精度来保存小数点后的数字。 double虽然不能保证所有数字都有7个小数位,但在小数点左侧不超过8位的情况下,它应该能满足您的需求。


2
-1 DoubleFloat基本上是一样的,只是精度更高。 - Alin Purcaru
Double类型很好用...这也是我在数据库中用于坐标的类型。 - Brad
1
@Alin:根据问题,OP错误地报告他的表正在使用“float”类型——6位数字精度与“float”的最高15位数字精度相比,这表明他目前正在使用“real”。 - Denis de Bernardy
2
@Alin,当然不是,但我认为使用double没有问题。你能具体说明一下吗? - Brad
1
如果给定的坐标是环绕世界数百次的向量,则 double 类型会失去精度,因为小数点左边的数字会减少小数点后可用的空间,但对于不太多次环绕世界的向量,它不应该失去精度,并且应该是进行数学处理的相当格式。 - Billy Moon
显示剩余4条评论

2

根据我的经验,最佳设置为DOUBLE(11,8),请注意lat/lng可能大于99。


0

将你的表改为 双精度 浮点数而不是单精度浮点数:

alter table properties modify latitude double, modify longitude double;

0

使用 Double

CREATE TABLE `properties` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(100) NOT NULL,
  `description` text,
  `latitude` Double DEFAULT NULL,
  `longitude` Double DEFAULT NULL,
  `landmark` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `serial` (`serial`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;

0

Decimal (10,8)足够了。有些GPS设备提供更精确的位置。


2
没有GPS可以提供如此高的精度。仅仅因为计算出的位置提供了额外的数字,并不意味着它们不是噪声。超过6个数字是一个极其准确的修正。 - Brad
十进制数具有固定精度。 - VGE
1
DECIMAL (2,8) 不是一个有效的声明。你可能想表达的是 DECIMAL (10,8) - Alin Purcaru

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