首页 > 解决方案 > 从 MySQL 5.7.26 迁移到 MySQL 8.0.23 时,MySQL 空间查询不起作用

问题描述

我不是 MySQL 专家,所以毫无疑问我忽略了一些简单的事情。

我有一个 MySQL DB(V 5.7.26),如果我在我的一个表上运行以下查询(作为示例),我会得到 39 的结果,这是我所期望的:

SELECT count(*) 
FROM `entities` 
WHERE
ST_CONTAINS(
    ST_GeomFromText('POLYGON((-0.4120 51.6009, -0.4120 51.3467, 0.1533  51.3467, 0.1533  51.6009, -0.4120 51.6009))', 4326),
    gloc
) = 1;

我在 MySQL V 8.0.23 中创建了相同的数据库,并通过导出表定义并通过在新数据库中运行查询来重新创建它们,所以据我所知,表定义等是相同的。

我将相同的数据导入到新数据库中,并且我知道数据是正确的,例如,如果我按另一个标准提取记录(例如通过记录 id 选择),我可以在地图(传单)上显示记录并且它在正确的位置。

但是,如果我在我的新数据库中运行与上述相同的查询,它返回的结果为 0。

如果我遗漏了 4326 的 SRID,那么我会收到一个错误(我希望)

/* SQL Error (3033): Binary geometry function st_contains given two geometries of different srids: 0 and 4326, which should have been identical. */
/* Affected rows: 0  Found rows: 0  Warnings: 0  Duration for 0 of 1 query: 0.000 sec. */

所以我不认为这是一个 SRID 问题。

gloc 被定义为“几何”类型,允许 NULL 值,但不存在。但是,如果我不允许 NULL 值,然后将空间索引添加到 gloc 列,则结果完全相同。

标签: mysqlgisgeospatialspatial

解决方案


我会检查纬度:经度顺序。MySql 8 遵循 CRS 定义的 4326 的 lat:lon 顺序。假设您的数据位于英格兰而不是印度洋,您应该交换坐标顺序。还要检查其他数据是否存在相同问题。

另请参阅 https://mysqlserverteam.com/axis-order-in-spatial-reference-systems/


推荐阅读