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

MySQL存储功能出现故障,但作为独立查询工作

基于this discussion,我有一个基本查询,其中包含两个坐标之间距离的计算.
它似乎作为独立查询运行良好,但当我尝试将其作为存储函数运行时,它返回奇怪的结果(通常为null或99.9999 …).

独立查询是:

SELECT lat, lng, 

  ( 6371 * acos( cos( radians(32.113277) ) * cos( radians( lat ) ) 
   * cos( radians(lng) - radians(34.799259)) + sin(radians(32.113277)) 
   * sin( radians(lat)))) AS distance_km,

   ( 6371000 * acos( cos( radians(32.113277) ) * cos( radians( lat ) ) 
   * cos( radians(lng) - radians(34.799259)) + sin(radians(32.113277)) 
   * sin( radians(lat)))) AS distance_meters

FROM (
    SELECT 32.113391 as lat , 34.801571 as lng
) a

^这很好.然后我尝试将其更改为存储函数

create function distance_meters(lat1 decimal(8,6), lng1 decimal(8,6), lat2 decimal(8,6), lng2 decimal(8,6) )
returns decimal(8,6) DETERMINISTIC
    return    ( 6371000 * acos( cos( radians(lat1) ) * cos( radians( lat2 ) ) 
   * cos( radians(lng2) - radians(lng1)) + sin(radians(lat2)) 
   * sin( radians(lat2))))

并执行它像这样:

select distance_meters(32.113277, 34.799259, 32.113391, 34.801571)

结果是99.999999

我甚至尝试将所有输入值(用于坐标)作为存储函数代码的一部分,如下所示:

create function distance_meters()
returns decimal(8,6) DETERMINISTIC
       return ( 6371000 * acos( cos( radians(32.113277) ) * cos( radians( 32.113391 ) ) 
   * cos( radians(34.801571) - radians(34.799259)) + sin(radians(32.113277)) 
   * sin( radians(32.113391))));

但它根本没有改变有问题的结果!

PS:当然我每次都会在重新创建之前删除它.还尝试将返回类型从十进制更改为数字.

编辑:正如评论中所建议的,我也试过这个:

DELIMITER $
create function distance_meters()
returns decimal(8,6) DETERMINISTIC
begin
declare var_name decimal(8,6);
set var_name = ( 6371000 * acos( cos( radians(32.113277) ) * cos( radians( 32.113391 ) ) 
   * cos( radians(34.801571) - radians(34.799259)) + sin(radians(32.113277)) 
   * sin( radians(32.113391))));
   return var_name;
end$
DELIMITER ;
select distance_meters()

在这里错过了什么?

解决方法:

似乎解决方案有两个部分.一部分是函数中的拼写错误,其中lat1和lat2被切换.

return ( 6371000 * acos( cos( radians(lat1) ) * cos( radians( lat2
) ) * cos( radians(lng2) – radians(lng1)) + sin(radians(lat1)) * sin( radians(lat2))));

另一位是足够提高十进制列的精度.我没有测试看到所需的最低精度是多少,但是当我尝试使用DECIMAL(18,6)它似乎工作.

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

相关推荐