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
'programing' 카테고리의 다른 글
Windows에서 MariaDB와 NodeJs에 액세스하는 방법 (0) | 2022.11.06 |
---|---|
윈도우 리터레이터를 롤링 또는 슬라이딩합니까? (0) | 2022.11.06 |
ST_CONTENS를 통한 성능 저하 (0) | 2022.11.06 |
VUEX가 변환을 찾지 못했지만 정의되어 있습니다. (0) | 2022.11.06 |
MySQL 오류 #1133 - 사용자 테이블에서 일치하는 행을 찾을 수 없습니다. (0) | 2022.11.04 |