Я пытаюсь импортировать данные CSV в MySQL, используя синтаксис LOAD DATA LOCAL INFILE
.Обычно это довольно простая задача, но в этом случае данные включают в себя геометрическое поле, которое сбивает меня с толку.
Когда я пытаюсь запустить импорт, я получаю такие ошибки:
SQLSTATE [HY000]: общая ошибка: 4079 Недопустимый тип данных параметра longblob для операции 'st_geometryfromwkb'
Записи в моем CSV-файле выглядят следующим образом:
'Somewhere', -0.574823, 51.150771, '0x0101000000000000000000F03F000000000000F0BF'
Итак, у меня есть имя местоположения, координаты широты и долготы и поле геометрии в двоичном формате WKB.(приведенный выше пример представляет собой простую геометрию, которая переводится в POINT(1,1)
; реальные данные имеют сложные многоугольники, но содержимое не имеет значения; проблема с этим простым примером та же).
Моя таблица выглядиткак это:
CREATE TABLE IF NOT EXISTS `mapping` (
`id` int AUTO_INCREMENT PRIMARY KEY,
`location` varchar(80) DEFAULT NULL,
`longitude` double DEFAULT NULL,
`latitude` double DEFAULT NULL,
`geom` geometry NOT NULL,
INDEX mapping_by_location (location),
SPATIAL KEY `mapping_by_geom` (`geom`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
И мой запрос на импорт выглядит так:
LOAD DATA LOCAL INFILE '{$file}'
REPLACE INTO TABLE `mapping`
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '\"'
LINES TERMINATED BY '\n'
(@col1, @col2, @col3, @col4)
SET
`location` = @col1,
`latitude` = @col2,
`longitude` = @col3,
`geom` = GeomFromWKB(@col4);
Как уже говорилось, с этим запросом на импорт я получаю ошибку Illegal parameter data type
, показанную в верхней частиэтот вопрос.
Однако запрос работает, если я заменяю последнюю строку жестко закодированной геометрической строкой, например так:
`geom` = GeomFromWKB(0x0101000000000000000000F03F000000000000F0BF);
Очевидно, что это не очень хорошо, так как янужно поле для загрузки из CVS, а не жестко закодированное значение в запросе, но оно работает, в то время как загрузка того же значения из CSV в @col4
не делает.
Я пробовал нескольковарианты этого запроса - с вызовом GeomFromWKB()
и без него, с обозначениями X'...'
и 0x...
для шестнадцатеричного значения;кажется, ничего не работает.
Кто-нибудь может мне помочь, пожалуйста?