mysql - 从 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 列,则结果完全相同。
解决方案
我会检查纬度:经度顺序。MySql 8 遵循 CRS 定义的 4326 的 lat:lon 顺序。假设您的数据位于英格兰而不是印度洋,您应该交换坐标顺序。还要检查其他数据是否存在相同问题。
另请参阅 https://mysqlserverteam.com/axis-order-in-spatial-reference-systems/
推荐阅读
- python-3.x - 将文本文件转换为字典
- javascript - 我怎样才能使结果一致?SetInterval 无法正常工作
- python - 将函数应用于数据框列?
- c# - 无法向自定义控件添加内容
- unity3d - Unity 改变了我的图像资源。我该如何解决?
- php - Laravel 刀片在尝试允许 HTML 时向数据添加“`{}`”
- javascript - Node.js MongoDB 利用 Promise 进行 MongoDB 方法调用
- sql - 使用 SQL 和 gRPC 时如何使用 Scan 和 Value?
- azure - Azure 数据工厂 - 将数据导出到子容器/blob
- javascript - 在 Javascript 中,ƒ 是什么意思?