POINT(X,Y)和GeomFromText(“ POINT(XY)”)之间有什么区别?


17

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

但是,我发现这POINT(X,Y)也可行。我没有找到任何说明为什么GeomFromText应代替POINT

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

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

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

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

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

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

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


我不知道是否存在任何性能差异(我猜不会,但这仅是猜测)。但是,从另一个表转换纬度和经度值时,第二种方法会更简单。INSERT INTO Site (Position) SELECT POINT(latitude, longitude) FROM tmp比简单...SELECT GeomFromText(CONCAT('POINT(',latitude,' ',longitude,')' )) ...
ypercubeᵀᴹ

我还发现第二个变体的构造要简单得多,这就是为什么我想知道通常第一个变体几乎在所有使用MySQL空间扩展的地方都被使用。
ComSubVie 2013年

我只是尝试使用这两种变体在上面的表中(在我的主机上)插入10.000.000个位置,但没有检测到任何可测量的性能差异。
ComSubVie 2013年

请考虑根据MySQL 8+以及后代重新评估:dba.stackexchange.com/a/227049/2639
Evan Carroll,

Answers:


16

与MySQL空间扩展相关的二进制格式有两种,一种是标准的“众所周知的二进制”(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 Geometry数据作为输入。

第一种方法在较新的服务器上可以工作(尽管在技术上是错误的),而第二种方法在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


1
谢谢,有趣的是,这仅在发行说明中作为“脚注”提及,而在文档中没有提及。因此,我将远离基于文本的方法。
ComSubVie 2013年

1
为什么五年后,MySQL文档仍然在插入时提供了使用ST_GeomFromText()函数的示例?这个答案仍然有意义吗?它有点混乱..的dev.mysql.com/doc/refman/5.7/en/populating-spatial-columns.html
马特·基兰

1
@MattKieran WKB和WKT是用于表示地理空间数据的标准化,开放格式。这些示例之所以使用它们,是因为面向标准的地理空间应用程序可能已经保存了这些格式的数据,从而允许MySQL将外部几何图形作为单个参数接受给ST_GeomFromText()类似的转换函数,而不是要求外部应用程序使用构造几何图形对象的本机SQL函数。可在《空间功能参考》中找到。该文档可以组织得更好。
Michael-sqlbot

@MattKieran这个答案也仍然有意义,原因在于它解释了为什么可能编写与文档相反的旧示例,以及为什么MySQL的表观类型与使用这种方法似乎表明的功能不匹配。这三种方法(本机SQL函数,WKB(二进制)或WKT(文本))均有效。不再需要 WKB 转换本机函数返回值,因为它们的返回类型不再像许多年前那样是WKB。
Michael-sqlbot

4

MySQL 8+

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

  • Point(X,Y)是具有精确度的数字的构造函数,不需要先转换为文本即可使其速度更快。还保证可以返回A POINT或FAIL。如果您想这样考虑,可以使用类型。
  • 众所周知的文本(WKT)构造函数:它们总是较慢,因为它们需要额外的步骤来解析众所周知的文本(WKT)。请注意,在较早的版本中,这些文件可能没有ST_前缀。在可用的情况下,使用带有ST_前缀的版本。仅当您的输入已经是众所周知的文本时,才使用WKT构造函数。如果不是,请使用Point(x,y)上面的构造函数。

明晰

跳过历史课,不做GeomFromText(Point(x,y))。那太可怕了,没有支持,也没有文件证明。


-1

使用GeomFromText或任何其他* FromText函数,您可以指定SRID。我认为您无法做到这一点。

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

这应该是另一种方法,即POINT(lng lat)代替POINT(lat lng)
Zishan

MySQL始终不使用SRID。因此,这毫无用处。如果需要SRID,请迁移到PostgreSQL / PostGIS。
伊万·卡罗尔

1
MySQL 8确实使用SRID。实际上,正是由于SRID,我无法将MySQL数据库从5.7迁移到8。
cmoran92
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.