MySQLデータベースにいくつかの幾何学的位置を保存したいのですが。これにはPOINTデータ型を使用します。ほとんどすべての場所で、テーブルにデータを挿入するには関数GeomFromText
を使用する必要があると読みました。
ただし、POINT(X,Y)
も機能することがわかりました。 GeomFromText
の代わりにPOINT
を使用する理由についての説明は見つかりませんでした。
たとえば、次の単純な関係があります。
_CREATE TABLE Site (
SiteID BIGINT UNSIGNED,
Position POINT
);
_
また、次の2つのバリアントを使用して値を挿入できます。
_INSERT INTO Site (
1,
GeomFromText( 'POINT(48.19976 16.45572)' )
);
INSERT INTO Site (
2,
POINT(48.19976, 16.45572)
);
_
テーブル(_SELECT * FROM Site
_)を表示すると、その場所の同じバイナリblobが表示され、座標(SELECT *, AsText(Position) FROM Site
)を表示すると、同じ値も表示されます。
では、なぜGeomFromTextを使用する必要があるのでしょうか。これら2つのバリアントの間に(既知の)パフォーマンスの違いはありますか?これはMySQL以外のデータベースシステムでどのように解決されますか?
MySQL空間拡張に関連する2つの異なるバイナリ形式があります。標準からの "well-known binary"(WKB) 形式と、MySQL内部GEOMETRY
データ型です。
MySQL 5.1.35より前のバージョンでは、POINT()
などの関数はMySQLの内部データ型を返しませんでした。彼らはWKBを返しました...その前に、あなたはこれをしなければなりませんでした:
_INSERT INTO t1 (pt_col) VALUES (GeomFromWKB(Point(1,2)));
_
しかし、今、あなたの例のように、これはうまくいきます:
_INSERT INTO t1 (pt_col) VALUES(Point(1,2));
_
開発者の功績として、Point()
および類似の関数を(より正気に)GEOMETRY
オブジェクトを返すように変更すると、GeomFromWKB()
および類似の関数が実際にいずれかのWKBを受け入れるようになりましたまたは、関数がWKBを入力として受け入れることを目的としている場合でも、MySQLジオメトリデータを入力として使用します。
MySQL 5.1.35より前の1つ目の方法は(技術的に間違っていても)新しいサーバーで機能し、2つ目の方法はまったく機能しません。 説明するかもしれない 問題を完全に回避するために、これまでに見たアプローチを使用して例が記述された理由そうでなければ...私はここに何も持っていません。
テキストを連結してから解析することは、適切な変数を入力として受け入れる関数よりも直感的に遅く、エラーが発生しやすいので、連結された文字列を作成してテキストベースの関数を使用する理由は考えられません。
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
後世のために重要なことは
Point(X,Y)
は、精度のある数値のコンストラクターであり、最初にテキストに変換する必要がないため、高速化されます。 RETURN Aも保証されていますPOINT
OR FAIL。これによりstronglyそのように考えたい場合は入力します。ST_
_接頭辞なしで見つかる可能性があることに注意してください。可能な場合は、_ST_
_接頭辞が付いたバージョンを使用してください。 WKTコンストラクターは、入力が既知のテキストである場合にのみ使用してください。そうでない場合は、上記のPoint(x,y)
コンストラクタを使用してください。ST_GeomFromText(wkt, srid)
返すことができる[〜#〜]任意[〜#〜]サポートされている空間タイプMySQLによって、WKTで表すことができます。これでlooselyと入力すると、そのように考えることができます。ST_PointFromText(wkt, srid)
既知のテキストからの強く型付けされたPOINT
- constructor。履歴レッスンをスキップします[〜#〜]決して[〜#〜]do GeomFromText(Point(x,y))
。それは恐ろしく、サポートされておらず、文書化されていません。