在mysql中检查格式正确和/或有效的几何图形

时间:2019-02-01 20:58:37

标签: mysql mariadb gis mysql-5.7 wkt

将具有几何数据的MariaDB表迁移到MySql,因为它们的格式不正确,即使它们不是MariaDB的问题,也无法插入某些数据。

此请求适用于MariaDB(10.2)。

CREATE TABLE IF NOT EXISTS geo (
    id INT AUTO_INCREMENT NOT NULL,
    value GEOMETRY NOT NULL,
    SPATIAL INDEX idx_value (value),
    PRIMARY KEY(id)
) ENGINE = InnoDB;
INSERT INTO geo (value) SELECT ST_GeomFromText('LINESTRING(1 2)');

不在MySql(5.7.20)上,错误是:

  

3037-为文本st_geometry提供的无效GIS数据。

在MySql中可以使用三种函数来标识此类几何:ST_IsSimple()ST_IsValid()ST_Validate(),但是它们不适用于格式错误的几何:

SELECT ST_IsSimple(ST_GeomFromText('LINESTRING(1 2)'));
SELECT ST_IsValid(ST_GeomFromText('LINESTRING(1 2)'));
SELECT ST_AsText(ST_Validate(ST_GeomFromText('LINESTRING(1 1)')));
  

3055-几何字节字符串必须为小端。

此示例来自https://dev.mysql.com/doc/refman/5.7/en/spatial-convenience-functions.html,但不起作用。因此很奇怪(该文档未针对5.7更新)。有关mysql有效性的更多详细信息:https://dev.mysql.com/doc/refman/5.7/en/geometry-well-formedness-validity.html(mysql接受任何语法上格式正确的输入,但不接受几何上无效的输入)。

此处有类似问题:

但是他们都没有回答这个问题:如何在mysql 5.7上识别格式错误的几何?

1 个答案:

答案 0 :(得分:1)

LineString至少需要两个点。 5.6在指出这一点上可能是疏忽大意。

mysql> SELECT hex(ST_GeomFromText('LINESTRING(1 1)'));
ERROR 3037 (22023): Invalid GIS data provided to function st_geometryfromtext.

mysql> SELECT hex(ST_GeomFromText('LINESTRING(1 1, 2 3)'));
+--------------------------------------------------------------------------------------------+
| hex(ST_GeomFromText('LINESTRING(1 1, 2 3)'))                                               |
+--------------------------------------------------------------------------------------------+
| 00000000010200000002000000000000000000F03F000000000000F03F00000000000000400000000000000840 |
+--------------------------------------------------------------------------------------------+

mysql> SELECT @@version;
+-----------+
| @@version |
+-----------+
| 5.7.15    |
+-----------+