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

时间:2011-05-31 13:17:40

标签: php mysql types floating-point

我想将从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 ;

7 个答案:

答案 0 :(得分:40)

如果您不希望数字近似,则需要使用decimal

  

定点(精确值)类型

     

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

现在“你走了”回答:

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

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

答案 1 :(得分: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

答案 2 :(得分:7)

使用double

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

答案 3 :(得分:2)

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

改变你的表,使它成为double precision浮点数,而不是单个精度浮点数:

alter table properties modify latitude double, modify longitude double;

答案 6 :(得分: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 ;