programing

mysql에서 올바른 형식 및/또는 유효한 지오메트리를 확인합니다.

shortcode 2022. 11. 6. 16:23
반응형

mysql에서 올바른 형식 및/또는 유효한 지오메트리를 확인합니다.

기하학적 데이터가 포함된 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 - 지오메트리 바이트 문자열은 little endian이어야 합니다.

이 예는 https://dev.mysql.com/doc/refman/5.7/en/spatial-convenience-functions.html,에서 제공되고 있습니다만, 동작하지 않습니다.이상합니다(이 문서는 5.7용으로 업데이트되지 않았습니다).mysql의 유효성에 대한 자세한 내용은http://https://dev.mysql.com/doc/refman/5.7/en/geometry-well-formedness-validity.html 를 참조해 주세요(구문적으로는 올바른 형식의 입력은 받아들여지지만 기하학적으로 무효인 입력은 받아들여지지 않습니다).

유사한 문제:

  • MySQL 공간 지오메트리의 유효성을 테스트하기 위해 MySQL에서 제공하는 함수는 입력으로 올바른 형식의 지오메트리가 필요합니다...
  • MySQL 5.7: 저장된 함수를 사용하고 예외 핸들러를 만드는 아이디어가 있는 GIS 데이터가 잘못되어 다소 복잡합니다.
  • 같은 문제를 요구하지만 응답이 없는 버그리포트:https://bugs.mysql.com/bug.php?id=76595
  • https://github.com/creof/doctrine2-spatial/issues/155 (http ph orm)는 결과가 mysql 버전 간에 변경되었음을 나타냅니다.

그러나 이들 중 누구도 mysql 5.7에서 형식이 잘못된 기하학적 구조를 식별하는 방법에 대한 답을 제공하지 않습니다.

LineString에는 적어도2개의 포인트가 필요합니다.아마도 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    |
+-----------+

언급URL : https://stackoverflow.com/questions/54487076/check-well-formed-and-or-valid-geometries-in-mysql

반응형