Saya ingin menyimpan beberapa posisi geometris di basis data MySQL saya. Untuk ini saya menggunakan tipe data TITIK. Hampir di mana-mana saya membaca bahwa fungsi tersebut GeomFromText
harus digunakan untuk memasukkan data dalam tabel.
Namun, saya menemukan bahwa itu POINT(X,Y)
juga berhasil. Saya tidak menemukan deskripsi mengapa GeomFromText
harus digunakan POINT
.
Misalnya saya memiliki hubungan sederhana berikut:
CREATE TABLE Site (
SiteID BIGINT UNSIGNED,
Position POINT
);
Dan saya bisa memasukkan nilai menggunakan dua varian berikut:
INSERT INTO Site (
1,
GeomFromText( 'POINT(48.19976 16.45572)' )
);
INSERT INTO Site (
2,
POINT(48.19976, 16.45572)
);
Ketika saya melihat tabel ( SELECT * FROM Site
) saya melihat gumpalan biner yang sama untuk lokasi, dan ketika saya melihat koordinat ( SELECT *, AsText(Position) FROM Site
) saya juga melihat nilai yang sama.
Jadi mengapa GeomFromText harus digunakan? Apakah ada (diketahui) perbedaan kinerja antara kedua varian ini? Bagaimana ini diselesaikan di sistem basis data selain MySQL?
sumber
INSERT INTO Site (Position) SELECT POINT(latitude, longitude) FROM tmp
lebih sederhana dari...SELECT GeomFromText(CONCAT('POINT(',latitude,' ',longitude,')' )) ...
Jawaban:
Ada dua format biner berbeda terkait dengan ekstensi spasial MySQL, format "biner terkenal" (WKB) dari standar, dan
GEOMETRY
tipe data internal MySQL .Sebelum ke MySQL 5.1.35, fungsi seperti
POINT()
tidak mengembalikan tipe data internal MySQL; mereka mengembalikan WKB ... jadi sebelum itu, Anda harus melakukan ini:Tapi sekarang, seperti dalam contoh Anda, ini berfungsi:
Untuk kredit pengembang, ketika mereka berubah
Point()
dan fungsi yang serupa untuk (lebih waras) mengembalikanGEOMETRY
objek, mereka mengizinkanGeomFromWKB()
dan fungsi serupa untuk benar-benar menerima data WKB atau MySQL Geometry sebagai input meskipun fungsi dimaksudkan untuk menerima WKB sebagai input.Fakta bahwa metode 1 bekerja (meskipun secara teknis salah) pada server yang lebih baru dan metode 2 tidak bekerja sama sekali sebelum MySQL 5.1.35 mungkin menjelaskan mengapa contoh ditulis menggunakan pendekatan yang Anda lihat - untuk hindari masalah sepenuhnya. Kalau tidak ... Saya tidak punya apa-apa, di sini.
Menggabungkan dan kemudian mem-parsing teks tampaknya secara intuitif lebih lambat dan lebih rentan kesalahan daripada fungsi yang menerima variabel yang tepat sebagai input, jadi saya tidak bisa memikirkan alasan apa pun untuk membuat string gabungan dan menggunakan fungsi berbasis teks.
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
sumber
ST_GeomFromText()
dan fungsi konversi yang serupa daripada memerlukan aplikasi eksternal untuk menggunakan fungsi SQL asli yang membangun objek geometri, yang ditemukan dalam Referensi Fungsi Spasial . Dokumen dapat diatur dengan lebih baik.MySQL 8+
Bagi anak cucu satu-satunya hal yang penting adalah itu
Point(X,Y)
adalah konstruktor untuk angka-angka dengan presisi dan tidak memerlukan konversi terlebih dahulu ke teks sehingga lebih cepat. Ini juga dijamin akan KEMBALIPOINT
ATAU GAGAL . Ini membuatnya sangat diketik jika Anda ingin memikirkannya seperti itu.ST_
awalan; jika tersedia, gunakan versi denganST_
awalan. Gunakan konstruktor WKT hanya jika input Anda sudah teks Terkenal. Jika tidak, gunakanPoint(x,y)
konstruktor di atas.ST_GeomFromText(wkt, srid)
dapat mengembalikan jenis spasial APAPUN yang didukung oleh MySQL dan dapat diwakili oleh WKT. Ini membuatnya diketik longgar jika Anda ingin memikirkannya seperti itu.ST_PointFromText(wkt, srid)
POINT
-constructor yang sangat diketik dari teks terkenal.Kejelasan
Melewatkan pelajaran sejarah, TIDAK PERNAH lakukan
GeomFromText(Point(x,y))
. Itu mengerikan, tidak didukung, dan tidak berdokumen.sumber
Dengan GeomFromText atau fungsi * FromText lainnya, Anda dapat menentukan SRID . Saya tidak berpikir Anda bisa melakukannya sebaliknya.
sumber
POINT(lng lat)
sebaliknya yaituPOINT(lat lng)