【问题标题】:Problem Storing Latitude and Longitude values in MySQL database在 MySQL 数据库中存储纬度和经度值的问题
【发布时间】:2011-09-05 12:03:33
【问题描述】:

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

12.9274529

77.5905970

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

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 ;

【问题讨论】:

  • 你真的尝试过其他数据类型吗?
  • @jezmck 我会简单地使用 varchar 并且它应该可以工作,但是由于纬度和经度是浮点值,因此使用我想要的任何数据类型都没有意义。我想知道的是存储此类值的正确数据类型。
  • @Ibrahim Azhar Armar 你能做一个SHOW CREATE TABLE 什么的并告诉使用数据类型是什么吗?
  • @Alin Purcaru 正如我已经说过的那样,它处于浮动状态。
  • @Ibrahim Azhar Armar 我只是想确保您确实使用了FLOAT 数据类型。

标签: php mysql types floating-point


【解决方案1】:

使用双重

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 ;

【讨论】:

    【解决方案2】:

    根据我的经验,最佳设置是 DOUBLE(11,8),请记住 lat/lng 可能 > 99

    【讨论】:

      【解决方案3】:
      【解决方案4】:

      十进制 (10,8) 绰绰有余。一些 GPS 设备可以提供更准确的位置。

      【讨论】:

      • 没有 GPS 可以提供如此高的精度。仅仅因为计算出的位置提供了额外的数字并不意味着它们不仅仅是噪音。超过 6 位数字是非常准确的解决方法。
      • 十进制数有固定的精度。
      • DECIMAL (2,8) 不是有效的声明。你的意思可能是DECIMAL (10,8)
      【解决方案5】:

      如果您不想让数字近似,则需要使用decimal

      定点(精确值)类型

      DECIMAL 和 NUMERIC 类型存储 精确的数字数据值。这些类型 重要时使用 保持精确的精度,例如 与货币数据。

      现在是“给你”的答案:

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

      根据需要调整这些数字。另外看看我之前在答案中链接的手动条目。

      【讨论】:

      • 在测试和玩弄浮点数、双精度和小数之后,我觉得使用 DECIMAL 很重要。谢谢你:)
      • 我的回答是双倍的,得到了​​更多的赞成票(+6 - 和 -3 票)——人们对此有不同的看法。我认为这一切都归结为优先事项,但在这种情况下可能没什么区别,两者都非常适合任务。有趣的话题,讨论这个问题的好机会。
      【解决方案6】:

      使用double

      float 缺乏必要的精度来保存小数点后的位数。 double,虽然并不总是保证所有数字都有 7 位小数,但小数点左边的数字不超过 8 位,所以应该可以满足您的需要。

      【讨论】:

      • -1 DoubleFloat 几乎相同,只是精度更高。
      • Double 工作正常...无论如何,这就是我在数据库中用于坐标的。
      • @Alin:根据问题,OP 错误地报告他的表使用的是 float 类型——float 的 6 位数精度与高达 15 的精度表明他目前正在使用real.
      • @Alin,当然不是,但我认为使用双精度没有问题。你能详细说明一下吗?
      • 如果给定的坐标是环绕世界数百次的向量,那么 double 会失去精度,因为小数点左边的数字会开始减少小数点后的可用空间量,但是对于不会环绕世界太多次的向量,它不应该失去精度,并且应该是数学处理的一种公平格式
      【解决方案7】:

      更改您的表格,使其成为 double precision 浮点数,而不是单精度浮点数:

      alter table properties modify latitude double, modify longitude double;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-12-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-22
        • 1970-01-01
        • 1970-01-01
        • 2014-05-19
        • 1970-01-01
        相关资源
        最近更新 更多