it-swarm.com.de

Was ist der Unterschied zwischen POINT (X, Y) und GeomFromText ("POINT (X Y)")?

Ich möchte einige geometrische Positionen in meiner MySQL-Datenbank speichern. Dafür verwende ich den Datentyp POINT. Fast überall lese ich, dass die Funktion GeomFromText verwendet werden sollte, um Daten in die Tabelle einzufügen.

Ich fand jedoch heraus, dass POINT(X,Y) auch funktioniert. Ich habe keine Beschreibung gefunden, warum GeomFromText anstelle von POINT verwendet werden sollte.

Zum Beispiel habe ich die folgende einfache Beziehung:

CREATE TABLE Site (
    SiteID      BIGINT UNSIGNED,
    Position    POINT
);

Und ich kann Werte mit den folgenden zwei Varianten einfügen:

INSERT INTO Site (
    1,
    GeomFromText( 'POINT(48.19976 16.45572)' )
);

INSERT INTO Site (
    2,
    POINT(48.19976, 16.45572)
);

Wenn ich die Tabelle ansehe (SELECT * FROM Site), Zeige ich denselben binären Blob für die Position, und wenn ich die Koordinaten ansehe (SELECT *, AsText(Position) FROM Site), sehe ich auch dieselben Werte.

Warum sollte GeomFromText verwendet werden? Gibt es (bekannte) Leistungsunterschiede zwischen diesen beiden Varianten? Wie wird dies in anderen Datenbanksystemen als MySQL gelöst?

18
ComSubVie

Es gibt zwei verschiedene Binärformate, die sich auf die räumlichen Erweiterungen von MySQL beziehen, das Format "bekannte Binärdatei" (WKB) aus den Standards und den internen MySQL-Datentyp GEOMETRY.

Vor MySQL 5.1.35 haben Funktionen wie POINT() den internen MySQL-Datentyp nicht zurückgegeben. sie haben WKB zurückgegeben ... also mussten Sie vorher Folgendes tun:

INSERT INTO t1 (pt_col) VALUES (GeomFromWKB(Point(1,2)));

Aber jetzt, wie in Ihrem Beispiel, funktioniert dies:

INSERT INTO t1 (pt_col) VALUES(Point(1,2));

Wenn die Entwickler Point() und ähnliche Funktionen geändert haben, um GEOMETRY Objekte (vernünftiger) zurückzugeben, haben sie GeomFromWKB() und ähnlichen Funktionen erlaubt, tatsächlich entweder WKB zu akzeptieren oder MySQL-Geometriedaten als Eingabe, obwohl die Funktionen WKB als Eingabe akzeptieren sollen.

Die Tatsache, dass die 1. Methode auf neueren Servern funktioniert (obwohl sie technisch falsch ist) und die 2. Methode vor MySQL 5.1.35 überhaupt nicht funktioniert könnte erklären Warum wurden Beispiele mit dem Ansatz geschrieben, den Sie gesehen haben - um das Problem vollständig zu vermeiden. Sonst ... ich habe hier nichts.

Das Verketten und anschließende Parsen von Text scheint intuitiv langsamer und fehleranfälliger zu sein als Funktionen, die geeignete Variablen als Eingabe akzeptieren. Daher kann ich mir keinen Grund vorstellen, verkettete Zeichenfolgen zu erstellen und die textbasierten Funktionen zu verwenden.

http://dev.mysql.com/doc/refman/5.1/en/creating-spatial-values.html#gis-wkb-functions

http://dev.mysql.com/doc/relnotes/mysql/5.1/en/news-5-1-35.html

17

MySQL 8+

Für die Nachwelt ist das Einzige, worauf es ankommt

  • Point(X,Y) ist ein Konstruktor für präzise Zahlen und erfordert keine Konvertierung zuerst in Text, um ihn schneller zu machen. Es wird auch garantiert RETURN A POINT OR FAIL . Dies macht es stark getippt, wenn du so darüber nachdenken willst.
  • Bekannter Text (WKT) Konstruktoren: Diese sind immer langsamer, da sie einen zusätzlichen Schritt erfordern, um den Bekannter Text (WKT)) zu analysieren. . Beachten Sie, dass diese in älteren Versionen ohne das Präfix ST_ Gefunden werden können. Verwenden Sie, sofern verfügbar, die Version mit dem Präfix ST_. Verwenden Sie die WKT-Konstruktoren nur, wenn Ihre Eingabe bereits bekannter Text ist. Wenn nicht, verwenden Sie den obigen Konstruktor Point(x,y).
    • ST_GeomFromText(wkt, srid) kann [~ # ~] jeden unterstützten [~ # ~] räumlichen Typ zurückgeben von MySQL und kann von WKT dargestellt werden. Dies macht es lose getippt, wenn Sie es so denken möchten.
    • ST_PointFromText(wkt, srid) ein stark typisierter POINT- Konstruktor aus bekanntem Text.

Klarheit

Überspringen der Geschichtsstunde, [~ # ~] niemals [~ # ~] do GeomFromText(Point(x,y)). Das ist schrecklich, nicht unterstützt und ohne Papiere.

4
Evan Carroll