mysql - 使用 LOAD DATA LOCAL INFILE 将几何数据导入 MySQL
问题描述
我正在尝试使用LOAD DATA LOCAL INFILE
语法将 CSV 数据导入 MySQL。这通常是一个相当简单的任务,但在这种情况下,数据包含一个让我很头疼的几何字段。
当我尝试运行导入时,我收到如下错误:
SQLSTATE [HY000]: 一般错误: 4079 Illegal parameter data type longblob for operation '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
则不能。
我在这个查询上尝试了一堆变体 - 有和没有调用 to GeomFromWKB()
,同时使用X'...'
和0x...
表示十六进制值;似乎没有任何效果。
任何人都可以给我一些帮助吗?
解决方案
推荐阅读
- automated-tests - Leanft 无法识别终端仿真器屏幕对象
- node.js - e2e - Error code: 135 - Could not find chromedriver at null. Run 'webdriver-manager update' to download binaries
- react-native - React Native 视图缩放
- angular - Angular-material-table :- Getting error for mat-table
- algorithm - 找到一组节点,其移除最大程度地减少了根的传递闭包
- python - if+or fails even though inverse condition works
- google-apps-script - What does the trigger quota of 20 / user / script mean?
- python - Error when using classes and then calling on the class
- postgresql - 基于所有者/外键的一张表中的 Postgres 唯一序列
- python - Python vaex 如何从 CSV 文件创建数据框?