mysql - 不稳定的 MySQL st_distance_sphere 结果
问题描述
MySQL 在使用时给出的结果st_distance_sphere
似乎真的很不稳定。
在用户表上运行此查询:(距点 9.45 公里内的用户列表)
select *, st_distance_sphere(`location`, ST_GeomFromText('point(-74.0104915 45.5576996)')) as distance from `users` having `distance` < 9450
返回正确的结果。
但在查询中从半径中删除 1 米:
select *, st_distance_sphere(`location`, ST_GeomFromText('point(-74.0104915 45.5576996)')) as distance from `users` having `distance` < 9449
给了我这个 SQL 语法错误:#1210 - Incorrect arguments to st_distance_sphere
我还注意到添加一条limit
语句会更改查询中断的点,具体取决于限制数。
有人对这种类型的查询有过类似的经历吗?我很难弄清楚这里发生了什么。
我正在使用 MySQL 5.7
谢谢!
编辑: 进一步的测试表明,查询在小集合(<~2-3k 行)上运行良好,但开始突破,非常奇怪。
解决方案
经过大量测试,我终于找到了不稳定的根源:
单个用户在数据库中的纬度/经度坐标(-100, 100) 无效,可能是因为通过 phpmyadmin 进行了一些人为干预。
纬度应在 -90.0 到 90.0 之间,经度在 -180.0 到 180.0 之间
当该用户最终在我们的搜索范围内时,查询崩溃了。这就是为什么所有参数都会对误差产生影响(极限声明、半径范围和中心点)。一旦用户输入结果,事情就变得疯狂了。
吸取教训,保护您的数据!
推荐阅读
- java - 找不到空指针异常
- python - 尝试/排除问题 Python 2.7
- c# - 如何从控制器显示一个简单列表以在视图的选择元素中查看?
- css - 如何找出重复的内联 CSS 样式?
- node.js - 如何检测用户是否已经在我的网站上使用社交帐户进行了签名并且现在想要创建一个普通帐户?
- azure - 没有运行时 Azure 服务总线传入请求
- java - 在 Java 8 中使用流按 Map 值分组
- angular-dart - 在 AngularDart 中路由到 webdev 服务
- airflow - 气流:第一个操作员完成后如何并行启动操作员
- ios - Branch.io 链接 Facebook 问题