Mysql 8 ST_GeomFromText 在函数 st_geomfromtext 中给出错误纬度超出范围。它必须在 [-90.000000, 90.000000] 内

new*_*bie 5 spatial geometry mysql-8.0

我正在 mysql 8 上尝试以下插入查询。

Insert Into fence Set       
            fenceName='aa',
            radius=2,                   
            fenceGeometry=ST_GeomFromText('POINT(102.1893310546875 3.880696482497261)', 4326)
Run Code Online (Sandbox Code Playgroud)

它在 mysql 5.7 上完美运行,但在 mysql 8 中我得到了这个 error Latitude 102.189331 is out of range in function st_geomfromtext. It must be within [-90.000000, 90.000000].

根据一些建议,我也这样做了。

ALTER TABLE fence MODIFY fenceGeometry geometry NOT NULL SRID 4326;
Run Code Online (Sandbox Code Playgroud)

但是它给了我相同的结果。

Eva*_*oll 8

那是因为在 MySQL 8 上,他们做了不可思议的事情并实现了做地理坐标的愚蠢方法(如 MySQL)。这打破了向后兼容性。

  • 当您在 MySQL(任何 SRID)上使用 Geometry 时,除了 4326,您使用的是 (long,lat)。这是笛卡尔系统上的 (x,y)。
  • 当您在 MySQL (SRID = 4326) 上使用 Geography 时,您使用 (lat, long)。这通常是 (y,x)。这样做是因为说英语的人倾向于说“纬度和经度”而不是“经度,纬度”

有趣的是,拥有 MySQL 的 Oracle 在 Oracle Spatial 上没有这样做。Oracle Spatial 和 PostGIS 是一致的 (long,lat)`。要解决此切换顺序,而不是

ST_GeomFromText('POINT(102.1893310546875 3.880696482497261)', 4326)
Run Code Online (Sandbox Code Playgroud)

但是这个,

ST_GeomFromText('POINT(3.880696482497261 102.1893310546875)', 4326)
Run Code Online (Sandbox Code Playgroud)

在 MySQL 5.x 中没有真正的地理坐标系。

边注

如果您有可以使用的积分,则不应为此使用 WKT Point(),并且ST_SRID(pt,SRID)

ST_SRID(Point(3.880696482497261, 102.1893310546875), 4326)
Run Code Online (Sandbox Code Playgroud)

更多信息

有关更多信息,另请参阅,

  • 这次真是万分感谢。这不仅不向后兼容,还让我想打自己的脸。 (3认同)
  • 看起来他们添加了 [ST_SwapXY](https://dev.mysql.com/doc/refman/8.0/en/gis-format-conversion-functions.html#function_st-swapxy) 函数来帮助缓解这种变化。 (2认同)