POINT(X,Y) 和 GeomFromText("POINT(XY)") 有什么区别?

Com*_*Vie 20 mysql performance spatial

我想在我的 MySQL 数据库中存储一些几何位置。为此,我使用 POINT 数据类型。我读到的几乎所有地方都GeomFromText应该使用该函数在表中插入数据。

但是,我发现这POINT(X,Y)也有效。我没有找到任何说明为什么GeomFromText应该使用POINT.

例如,我有以下简单的关系:

CREATE TABLE Site (
    SiteID      BIGINT UNSIGNED,
    Position    POINT
);
Run Code Online (Sandbox Code Playgroud)

我可以使用以下两种变体插入值:

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

INSERT INTO Site (
    2,
    POINT(48.19976, 16.45572)
);
Run Code Online (Sandbox Code Playgroud)

当我查看表 ( SELECT * FROM Site) 时,我会看到该位置的相同二进制 blob,而当我查看坐标 ( SELECT *, AsText(Position) FROM Site) 时,我也会看到相同的值。

那么为什么要使用 GeomFromText 呢?这两种变体之间是否存在任何(已知的)性能差异?这是如何在除 MySQL 之外的其他数据库系统中解决的?

Mic*_*bot 19

有两种与 MySQL 空间扩展相关的不同二进制格式,标准中的“众所周知的二进制”(WKB)格式和 MySQL 内部GEOMETRY数据类型。

在 MySQL 5.1.35 之前,函数 likePOINT()不返回 MySQL 内部数据类型;他们返回了 WKB ......所以在此之前,你必须这样做:

INSERT INTO t1 (pt_col) VALUES (GeomFromWKB(Point(1,2)));
Run Code Online (Sandbox Code Playgroud)

但是现在,就像在您的示例中一样,这有效:

INSERT INTO t1 (pt_col) VALUES(Point(1,2));
Run Code Online (Sandbox Code Playgroud)

Point()值得开发人员称赞的是,当他们将类似函数更改为(更明智地)返回GEOMETRY对象时,他们允许GeomFromWKB()类似函数实际接受 WKB 或 MySQL Geometry 数据作为输入,即使这些函数旨在接受 WKB 作为输入。

第一种方法在较新的服务器上有效(尽管在技术上是错误的),而第二种方法在 MySQL 5.1.35 之前根本不起作用,这一事实可能解释了为什么使用您所见过的方法编写示例——完全避免这个问题。否则……我什么都没有,在这里。

与接受适当变量作为输入的函数相比,连接然后解析文本在直觉上看起来更慢且更容易出错,所以我想不出有任何理由来制作连接字符串并使用基于文本的函数。

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

  • @MattKieran WKB 和 WKT 是用于表达地理空间数据的标准化开放格式。这些示例使用它们是因为面向标准的地理空间应用程序可能已经保存了这些格式的数据,允许 MySQL 接受外部几何图形作为`ST_GeomFromText()` 和类似转换函数的单个参数,而不是要求外部应用程序使用本机 SQL 函数构造几何对象,可在 [空间函数参考](https://dev.mysql.com/doc/refman/5.7/en/spatial-function-reference.html) 中找到。可以更好地组织文档。 (2认同)

Eva*_*oll 6

MySQL 8+

对于后代来说,唯一重要的是

  • Point(X,Y)是精确数字的构造函数,不需要先转换为文本,使其更快。它还保证RETURN A POINTOR FAIL。如果你想这样想的话,这使它成为类型的。
  • Well-Known text (WKT)构造函数:这些总是较慢,因为它们需要额外的步骤来解析Well-Known text (WKT)。请注意,在旧版本中,这些可以在没有ST_前缀的情况下找到;如果可用,请使用带有ST_前缀的版本。仅当您的输入已经是众所周知的文本时才使用 WKT 构造函数。如果没有,请使用Point(x,y)上面的构造函数。

明晰

跳过历史课,永远不要GeomFromText(Point(x,y))。这太可怕了,没有支持,没有记录。