2013-09-09 3 views
1

В mysql У меня есть varchar, содержащий широту и долготу, предоставляемые картами Google. Мне нужно иметь возможность запроса на основе значения ограничивающей рамки, но теперь нет необходимости в доступных функциях geo. Я пытаюсь заполнить 2 новых десятичных поля десятичными значениями, найденными в varchar. Вот запрос, который я пытаюсь использовать, но результатом являются все округленные значения в новых полях.MySql Как преобразовать varchar (широта, долгота) в десятичные поля?

Образец данных:

'45.390746926938185, -122.75535710155964', 
'45.416444621636415, -122.63058006763458' 

Создание таблицы:

CREATE TABLE IF NOT EXISTS `cameras` (
    `id` int(11) NOT NULL auto_increment, 
    `user_id` int(75) NOT NULL, 
    `position` varchar(75) NOT NULL, 
    `latitude` decimal(17,15) default NULL, 
    `longitude` decimal(18,15) default NULL, 
    `address` varchar(75) NOT NULL,<br /> 
    `date` varchar(11) NOT NULL,<br /> 
    `status` int(1) NOT NULL default '1', 
    `duplicate_report` int(11) NOT NULL default '0', 
    `missing_report` int(11) NOT NULL default '0', 
    PRIMARY KEY (`id`), 
    KEY `user_id` (`user_id`), 
    KEY `status` (`status`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1050 ; 

SQL:

UPDATE cameras 
SET latitude = CAST((substring(position,1,locate(',',position))) AS DECIMAL(17,15)), 
    longitude = CAST((substring(position,locate(',',position)+1)) AS DECIMAL(18,15)) 

SQL Alternate попытка:

UPDATE cameras 
SET latitude = CONVERT((substring(position,1,locate(',',position))), DECIMAL(17,15)), 
    longitude = CONVERT((substring(position,locate(', ',position)+1)), DECIMAL(18,15)) 

Полученные значения поля для обоих сценариев:

45.000000000000000 and -122.000000000000000 
AND 
45.000000000000000 and -122.000000000000000 

Может кто-нибудь увидеть, что я делаю неправильно? Спасибо.

ответ

1

Оба варианта CAST и CONVERT выглядят правильно.

SELECT CAST((SUBSTRING(t.position,1,LOCATE(',',t.position))) AS DECIMAL(17,15)) AS lat_ 
    , CONVERT(SUBSTRING(t.position,LOCATE(', ',t.position)+1),DECIMAL(18,15)) AS long_ 
    FROM (SELECT '45.390746926938185, -122.75535710155964' AS `position`) t 

       lat_     long_ 
------------------ ---------------------- 
45.390746926938185 -122.755357101559640 

Я думаю, что позиция является зарезервированным словом, но я не думаю, что это имеет значение в этом случае. Но это не мешало бы присвоить псевдоним таблицы и квалифицировать все ссылки столбцов

UPDATE cameras c 
    SET c.latitude = CAST((SUBSTRING(c.position,1,LOCATE(',',c.position))) AS DECIMAL(17,15)) 
    , c.longitude = CAST((SUBSTRING(c.position,LOCATE(',',c.position)+1)) AS DECIMAL(18,15)) 

Но я подозреваю, что не будет решить эту проблему.

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

Предлагаю вам попробовать выполнить только запрос.

SELECT CAST((SUBSTRING(c.position,1,LOCATE(',',c.position))) AS DECIMAL(17,15)) AS lat_ 
    , CAST((SUBSTRING(c.position,LOCATE(',',c.position)+1)) AS DECIMAL(18,15)) AS lon_ 
    FROM cameras c 

и убедитесь, что вы получаете ожидаемые десятичные значения.

Точечный символ следует понимать как десятичную точку. Столбец позиции содержит некоторые другие специальные символы, такие как пробел или что-то еще?

От того, что вы разместили, это выглядит как CAST и CONVERT, работающие с целочисленной частью до десятичной точки. (Там не должно быть неявным новообращенный подписал целое там, так что не ясно, почему символы после десятичной запятой, не включаются.)


Если вы можете выяснить, какой символ (ы) используются для представления десятичной точки, тогда вы можете использовать функцию MySQL REPLACE() для замены тех, у кого есть простой символ точки.

+0

Спасибо за помощь, но запуск этого последнего запроса привел ко всем значениям, имеющим .000000000000000, я думаю. вызывает проблемы. – otay

+0

@ user1598994: Попробуйте выполнить запрос, подобный тому, который находится в верхней части моего ответа, где вы можете ввести точку. Это работает? – spencer7593

+0

Извините spencer7593, результатом первого запроса остается куча нулей – otay

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