POINT (X, Y) ve GeomFromText (“POINT (XY)”) arasındaki fark nedir?


17

MySQL veritabanımda bazı geometrik pozisyonları saklamak istiyorum. Bunun için POINT veri tipini kullanıyorum. Hemen hemen her yerde fonksiyonun GeomFromTexttabloya veri eklemek için kullanılması gerektiğini okudum .

Ancak, bunun POINT(X,Y)da işe yaradığını öğrendim . Bunun GeomFromTextyerine neden kullanılması gerektiğine dair bir açıklama bulamadım POINT.

Örneğin ben aşağıdaki basit bir ilişki var:

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

Ve aşağıdaki iki varyantı kullanarak değerler ekleyebilirim:

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

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

Tabloya ( SELECT * FROM Site) baktığımda konum için aynı ikili blob görüyorum ve koordinatları ( SELECT *, AsText(Position) FROM Site) gördüğümde de aynı değerleri görüyorum.

Peki GeomFromText neden kullanılmalı? Bu iki değişken arasında (bilinen) performans farklılıkları var mı? Bu MySQL dışındaki diğer veritabanı sistemlerinde nasıl çözülür?


Herhangi bir performans farkı olup olmadığını bilmiyorum (tahmin etmem ama bu sadece bir tahmin). Ancak ikinci yaklaşım, başka bir tablodan enlem ve boylam değerlerini dönüştürürken daha basit olacaktır. INSERT INTO Site (Position) SELECT POINT(latitude, longitude) FROM tmpdaha basit...SELECT GeomFromText(CONCAT('POINT(',latitude,' ',longitude,')' )) ...
ypercubeᵀᴹ

Ayrıca ikinci varyantı inşa etmek çok daha basit, bu yüzden genellikle ilk olanın MySQL uzamsal uzantıların kullanıldığını gördüğüm hemen hemen her yerde kullanıldığını merak ediyorum.
ComSubVie

Her iki varyantı kullanarak yukarıdaki tabloya (sunucumda) 10.000.000 yer eklemeyi denedim ve herhangi bir ölçülebilir performans farkı tespit etmedim.
ComSubVie

Lütfen bunu MySQL 8+ ışığında ve gelecek nesiller için yeniden değerlendirmeyi düşünün: dba.stackexchange.com/a/227049/2639
Evan Carroll

Yanıtlar:


16

MySQL uzamsal uzantılarıyla ilgili iki farklı ikili format vardır , standartlardan "iyi bilinen ikili" (WKB) formatı ve MySQL dahili GEOMETRYveri türü.

MySQL 5.1.35'ten önce, gibi işlevler POINT()MySQL dahili veri türünü döndürmedi; WKB'ye geri döndüler ... o zamandan önce bunu yapmak zorundaydınız:

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

Ama şimdi, örneğinizde olduğu gibi, bu işe yarıyor:

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

Geliştiricilerin kredisine göre, değiştiklerinde Point()ve benzer işlevleri (daha güvenli bir şekilde) dönüş GEOMETRYnesnelerine dönüştürdüklerinde, GeomFromWKB()işlevlerin WKB'yi giriş olarak kabul etmesine rağmen, WKB veya MySQL Geometri verilerini giriş olarak kabul etmelerine izin verdiler .

MySQL 5.1.35'ten önce 1. yöntemin daha yeni sunucularda (teknik olarak yanlış olmasına rağmen) ve 2. yöntemin hiç çalışmıyor olması, gördüğünüz yaklaşım kullanılarak örneklerin neden yazıldığını açıklayabilir - sorunu tamamen önleyin. Aksi halde ... Burada hiçbir şeyim yok.

Metin birleştirmek ve sonra ayrıştırmak sezgisel olarak daha yavaş ve girdi olarak uygun değişkenleri kabul fonksiyonları daha hata eğilimli görünüyor, bu yüzden birleştirilmiş dizeleri zanaat ve metin tabanlı işlevleri kullanmak için herhangi bir neden düşünemiyorum.

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


1
Teşekkürler, bunun sadece sürüm notlarında "dipnot" olarak belirtilmesi ilginçtir ve belgelerin hiçbir yerinde yoktur. Metin tabanlı yöntemlerden uzak duracağım.
ComSubVie

1
Neden 5 yıl sonra MySQL dokümanları yerleştirirken ST_GeomFromText () fonksiyonunu kullanmaya örnekler veriyor? Bu cevap hala alakalı mi? Biraz kafa karıştırıcı .. dev.mysql.com/doc/refman/5.7/en/populating-spatial-columns.html
Matt Kieran

1
@MattKieran WKB ve WKT coğrafi konum verilerini ifade etmek için standartlaştırılmış, açık formatlardır. Standart odaklı jeo-uzamsal uygulamalar zaten bu formatlarda veri tutabilir, bu da MySQL'in ST_GeomFromText()harici uygulamaların geometri nesnelerini oluşturan yerel SQL işlevlerini kullanmasını istemek yerine harici geometrileri tek bir argüman ve benzer dönüştürme işlevleri olarak kabul etmesine izin verebilir. bulunan Mekansal Fonksiyon Referans . Dokümanlar daha iyi organize edilebilir.
Michael - sqlbot

Ayrıca @MattKieran bu cevap sadece eski örneklerin neden belgelerin aksine yazıldığını, MySQL'in neden bu şekilde fonksiyonların bu şekilde kullanıldığını gösterdiği anlaşılan tipteki uyumsuzluklarla çalıştığını açıkladığı anlamıyla ilgilidir. Her üç yöntem de - yerel SQL işlevleri, WKB (ikili) veya WKT (metin) - geçerlidir. Ne artık gerekli değildir yerli işlev dönüş değerleri convering olduğu gelen onlar yıllar önce olduğu gibi kendi dönüş türleri artık WKB çünkü, WKB.
Michael - sqlbot

4

MySQL 8+

Gelecek kuşaklar için önemli olan tek şey

  • Point(X,Y)hassas sayılar için bir yapıcıdır ve önce metne dönüştürmeyi gerektirmez. Ayrıca A POINTVEYA BAŞARISIZ DÖNÜŞ garanti edilir . Bu şekilde düşünmek istiyorsanız , onu güçlü bir şekilde yazıyor.
  • Metin (WKT) Tanınmış kurucular: bunlar hep onlar ayrıştırmak için ilave bir adım gerektirir olarak, yavaş Tanınmış metin (WKT) . Eski sürümlerde bunların ST_önek olmadan bulunabileceğini unutmayın ; varsa, ST_öneki olan sürümü kullanın . WKT yapıcılarını yalnızca girişiniz zaten iyi bilinen bir metinse kullanın. Değilse, Point(x,y)yukarıdaki yapıcıyı kullanın .
    • ST_GeomFromText(wkt, srid)MySQL tarafından desteklenen ve WKT tarafından temsil edilebilen HERHANGİ bir uzamsal tür döndürebilir . Bu şekilde düşünmek istiyorsanız , onu gevşek yazıyor.
    • ST_PointFromText(wkt, srid)POINTİyi bilinen bir metinden güçlü bir şekilde yazılmış bir yapıcı.

berraklık

Tarih dersini atlamayın, ASLA yapmayın GeomFromText(Point(x,y)). Bu korkunç, desteklenmeyen ve belgesiz.


-1

GeomFromText veya başka herhangi * FromText ile belirtebilirsiniz işlev SRID . Başka türlü yapabileceğini sanmıyorum.

PointFromText('POINT(lat lng)', 4326)

Bu, POINT(lng lat)bunun yerine başka bir yol olmalıPOINT(lat lng)
Zishan

MySQL, SRID'leri zaten kullanmaz. Yani bu oldukça işe yaramaz. SRID'lere ihtiyacınız varsa PostgreSQL / PostGIS'e geçin.
Evan Carroll

1
MySQL 8 SRID kullanır. Aslında, SRID'ler nedeniyle tam olarak 5.7'den 8'e taşınan bir MySQL DB ile sorun yaşıyorum.
cmoran92
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.