Тип данных POINT в MySQL

Не так давно передо мной стояла задача о необходимости хранить географические координаты (долготу и широту) в БД. Для этих целей в MySQL есть замечательный тип данных —  POINT. Он представляет собой структуру из нескольких полей.

Кроме того, к этому типу можно (и даже нужно) применять встроенные функции. Именно эти функции определяют, какие данные необходимо хранить: точку или линию, а может даже множество точек или множество линий. Разберем пример. Есть небольшая таблица в реляционной БД, назовем ее geo. И имеет она следующую структуру

  1. `id` int(11) NOT NULL AUTO_INCREMENT,
  2. `place_name` varchar(40) NOT NULL,
  3. `coordinates` point NOT NULL

Для того чтобы создать такую таблицу, воспользуйтесь следующим SQL-запросом:

  1. CREATE TABLE IF NOT EXISTS `geo` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `place_name` varchar(40) NOT NULL,
  4. `coordinates` point NOT NULL,
  5. PRIMARY KEY (`id`)
  6. ) ENGINE=MyISAM DEFAULT CHARSET=utf8

Для того чтобы вставить строку в таблицу, воспользуемся конструкцией INSERT

  1. INSERT INTO `geo` (`place_name`, `coordinates`) VALUES (‘Apremont’, PointFromText(‘POINT(49.2343503980067 2.52738212494082)’));

У этого типа есть один недостаток: данные нельзя просмотреть. Например в phpMyAdmin данные поля coordinates будут выглядеть вот так: mysql-point-data
И для того чтобы получить долготу и широту, придется воспользоваться вот таким SQL-запросом:

  1. SELECT X( `coordinates` ) , Y( `coordinates` )
  2. FROM `geo`
  3. WHERE 1
  4. LIMIT 1

Остался последний нюанс. Если у Вас возникают проблемы при экспортировании данных таблицы в которой присутствуют поля типа POINT, а именно, если после экспорта данных координаты не отображаются, то это означает, что Вы неправильно сделали экспорт. Наверняка Вы сделали экспорт в текст, затем скопировали его и вставили как SQL запрос. Нужно сделать экспорт в файл, а затем сделать импорт из этого файла.