2013-04-08 5 views
5

У меня есть таблица, в которой хранятся координаты долготы и широты (карты google). У меня есть столбцы, которые определены как float, однако когда я пытаюсь вставить значение -61.45859899999999 и 10.28289, они округляется до -61,46 и 10,30. Как я могу изменить столбцы для хранения данных как есть.MySql using Float Data Type для хранения географических координат

Я использую mysql жаба. Под код для таблицы:

CREATE TABLE `tblGeoCodes` (
    `recNo` int(11) NOT NULL AUTO_INCREMENT, 
    `longLocation` float(30,2) DEFAULT NULL, 
    `latLocation` float(30,2) DEFAULT NULL 
+0

Возможный дубликат [Какой идеальный тип данных используется при хранении широты/долготы в базе данных MySQL?] (Http://stackoverflow.com/questions/159255/what-is-the-ideal-data-type -to-use-when-storing-latitude-longitudes-in-mysql) – Gajus

ответ

13

Есть две проблемы с вашей реализацией.

Причина значения оба округлением до 2 цифр точности является то, что вы явно определили масштаб как 2.

Кроме того, FLOAT является неточным типом данных в MySQL.

Для решения обеих проблем вы должны использовать тип данных DECIMAL с соответствующей точностью и масштабами.

Например, что-то вроде этого:

CREATE TABLE `tblGeoCodes` (
    `recNo` int(11) NOT NULL AUTO_INCREMENT primary key, 
    `longLocation` decimal(18,14) DEFAULT NULL, 
    `latLocation` decimal(18,14) DEFAULT NULL 
); 

Пример:

mysql> CREATE TABLE `tblGeoCodes` (
    -> `recNo` int(11) NOT NULL AUTO_INCREMENT primary key, 
    -> `longLocation` decimal(18,14) DEFAULT NULL, 
    -> `latLocation` decimal(18,14) DEFAULT NULL 
    ->); 
Query OK, 0 rows affected (0.02 sec) 

mysql> 
mysql> insert into tblGeoCodes (longLocation,latLocation) values(-61.45859899999999 , 10.28289); 
Query OK, 1 row affected (0.00 sec) 

mysql> 
mysql> select * from tblGeoCodes; 
+-------+--------------------+-------------------+ 
| recNo | longLocation  | latLocation  | 
+-------+--------------------+-------------------+ 
|  1 | -61.45859899999999 | 10.28289000000000 | 
+-------+--------------------+-------------------+ 
1 row in set (0.00 sec) 
+0

Я пробовал это, и я получаю -61.45860000000000, когда я вставляю -61.45859899999999, как я могу предотвратить это? – devdar

+0

Я добавлю пример, показывающий эту работу. –

+0

Большое спасибо, я буду строить эту таблицу вручную. – devdar

0

Я хотел бы предложить, чтобы преобразовать MyISAM воспользоваться GSI. Он лучше подходит для этой цели и должен работать лучше.

Однако, как уже было сказано, повышение точности поплавковых полей может быть более простым решением. Поскольку вы отметили вопрос, как google-maps releted, я также рекомендую this tutorial на сайте Google.

+0

будет ли я иметь поплавок, который не имеет значения? – devdar

+0

Также, как вы знаете, что OP не использует MyISAM? –

+0

Возможно, я не дал практического ответа. Я редактировал для более полезного (надеюсь). – guessimtoolate

5

,2 в float(30,2) представляет собой 2 знаков после запятой. Я использую float(10,6), так как это достаточно, чтобы удерживать координаты.

+1

Ну, шесть десятичных точек - около 2 дюймов на экваторе (или любой линии долготы), поэтому, если это достаточная точность, вы можете с 6 десятичными знаками. Это зависит от того, с какой целью вы используете широту и долготу. –

+0

Поскольку OP использует координаты в Картах Google, и большинство GPS-систем точны примерно до 10 метров, 6 десятичных знаков являются адекватными –

+0

Overkill, а не адекватный, я бы предложил. Четыре десятичных точки - 18,3 фута (5.6 м), поэтому вы могли бы сэкономить некоторое пространство и некоторое время вычисления, если вы сохранили 4 вместо 6. –

0

Услышав, что FLOAT(10,6) не имеет смысла, это резервирует 4 цифры для целочисленной части.

Лично я предпочитаю DOUBLE(9,6), но вместо этого вы можете использовать FLOAT, чтобы сохранить 4 дополнительных байта.

Смежные вопросы