将具有几何数据的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上识别格式错误的几何?
答案 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 |
+-----------+