微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从 MySQL 5.7.26 迁移到 MySQL 8.0.23 时,MySQL 空间查询不起作用

如何解决从 MySQL 5.7.26 迁移到 MySQL 8.0.23 时,MySQL 空间查询不起作用

我不是 MysqL 专家,所以毫无疑问我忽略了一些简单的东西。

我有一个 MysqL 数据库 (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 被定义为 'geometry' 类型,尽管不存在,但允许 NULL 值。但是,如果我禁止使用 NULL 值,然后向 gloc 列添加空间索引,则结果完全相同。

解决方法

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

另见 https://mysqlserverteam.com/axis-order-in-spatial-reference-systems/

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。