17
votes

I want to store the values of latitude and longitude fetched from Google Maps GeoCoding API in a MySQL database. The values are in float format.

12.9274529

77.5905970

And when I want to store it in database (which is datatype float) it rounds up float and store it in following format:

12.9275

77.5906

Am I using the wrong datatype? If yes then what datatype should I be using to store latitude and longitude values?

Update :

here is the CREATE TABLE as requestted by Allin

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
Have you actually tried other datatypes?jezmck
@jezmck i would have simply used varchar and it should have worked, but since the latitude and longitude are float values it does not make sense to use whichever datatype i want. what i want to know is the correct datatype for storing this type of values.Ibrahim Azhar Armar
@Ibrahim Azhar Armar Can you do a SHOW CREATE TABLE or something and tell use what the data type is?Alin Purcaru
@Alin Purcaru as i already said it is in float.Ibrahim Azhar Armar
@Ibrahim Azhar Armar I just wanted to make sure you actually used the FLOAT data type.Alin Purcaru

7 Answers

40
votes

You need to use decimal if you don't want the numbers to be approximated.

Fixed-Point (Exact-Value) Types

The DECIMAL and NUMERIC types store exact numeric data values. These types are used when it is important to preserve exact precision, for example with monetary data.

And now the "here you go" answer:

Use DECIMAL(10,7). Where 10 is the total number of digits in the number and 7 is the number of digits after the .. (This means that before the dot will be 3 digits.)

Adjust these numbers as needed. Also please take a look at the manual entry I linked earlier in the answer.

7
votes

use double

float lacks the necessary precision to save that number of digits after the decimal point. double, although not always guaranteed to have 7 decimal places for all numbers, will have where there are not more than 8 digits on the left of the decimal so should suit your needs.

2
votes

The optimal setup in my experience is DOUBLE(11,8), keep in mind that lat/lng could be > 99

0
votes

Alter your table so it's a double precision float instead of a single precision float:

alter table properties modify latitude double, modify longitude double;
0
votes

Decimal (10,8) is more than enough. Some GPS devices provide more accurate position.

0
votes

Use 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 ;