MySQL 8中Polygon类型数据插入报错及ESRI参数传递问题
MySQL 8 Polygon插入报错及解决方案
我有一个MySQL 8表,其中包含类型为Polygon的coordinates列。执行以下INSERT语句时,出现column count doesn't match value count at row 1错误:
INSERT INTO contract (coordinates) VALUES (POLYGON( (34.786166422784426, 32.162676265661624), (34.720248454034426, 32.01024096292725), (34.816378825128176, 31.973162105505374), (34.86993717473755, 32.1338371543335), (34.786166422784426, 32.162676265661624)) )
另外,以下语句可正常运行:
INSERT INTO contract (coordinates, smart_contract_version_id) VALUES (ST_GeomFromText('POLYGON(( 34.786166422784426 32.162676265661624 , 34.720248454034426 32.01024096292725 , 34.816378825128176 31.973162105505374 , 34.86993717473755 32.1338371543335 , 34.786166422784426 32.162676265661624 ))', 4326), 1)
报错原因
MySQL的POLYGON()构造函数语法要求:多边形的点必须用双层括号包裹,且每个点的坐标之间用空格分隔,而非逗号。你当前的写法里,每个点单独用括号包裹,MySQL会将每个括号内的两个值识别为两个独立的列值,导致列数与值数不匹配,触发"column count doesn't match"错误。
正确格式化查询
有两种常用的正确写法:
方法1:使用POLYGON()构造函数
遵循双层括号+空格分隔坐标的语法:
INSERT INTO contract (coordinates) VALUES (POLYGON(( 34.786166422784426 32.162676265661624, 34.720248454034426 32.01024096292725, 34.816378825128176 31.973162105505374, 34.86993717473755 32.1338371543335, 34.786166422784426 32.162676265661624 )))
方法2:使用ST_GeomFromText()
如果需要指定空间参考系(如4326),这种写法更清晰,也和你正常运行的语句逻辑一致:
INSERT INTO contract (coordinates) VALUES (ST_GeomFromText('POLYGON(( 34.786166422784426 32.162676265661624, 34.720248454034426 32.01024096292725, 34.816378825128176 31.973162105505374, 34.86993717473755 32.1338371543335, 34.786166422784426 32.162676265661624 ))', 4326))
显式传递ESRI参数
MySQL中处理ESRI格式的空间数据,需使用专门的函数或调整坐标顺序:
方法1:使用ST_GeomFromESRI()
ESRI格式采用纬度在前、经度在后的坐标顺序,与OGC标准相反,使用该函数可直接解析:
INSERT INTO contract (coordinates) VALUES (ST_GeomFromESRI('POLYGON(( 32.162676265661624 34.786166422784426, 32.01024096292725 34.720248454034426, 31.973162105505374 34.816378825128176, 32.1338371543335 34.86993717473755, 32.162676265661624 34.786166422784426 ))', 4326))
注意事项
转换ESRI格式数据时,必须确保坐标顺序正确,否则会出现空间位置偏移问题。
内容的提问来源于stack exchange,提问作者Boris K
相关产品推荐
相关产品推荐

