将包含几何数据的 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 - Invalid GIS data provided to function st_geometryfromtext.


在 MySql 中有 3 个函数来识别这样的几何图形: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 - Geometry byte string must be little endian.


本例来自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 spatial geometry validate wkt ,答案是:MySQL 提供的测试几何有效性的函数需要格式正确的几何作为输入...

MySQL 5.7: Invalid GIS data ,其中有使用存储函数和创建异常处理程序的想法,所以有点复杂。

一个错误报告询问同样的问题,但没有回应:https://bugs.mysql.com/bug.php?id=76595

https://github.com/creof/doctrine2-spatial/issues/155 (doctrine php orm),表示结果在不同版本的 mysql 之间发生变化。

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


最佳答案


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    |

+-----------+

关于mysql - 检查 mysql 中格式正确和/或有效的几何图形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54487076/