You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MariaDB与MySQL的POINT类型:经纬度指定及返回顺序

MySQL与MariaDB中POINT类型的经纬度顺序问题解析

在使用MySQL和MariaDB的POINT等空间列类型时,经纬度的顺序是一个容易踩坑的点——不同应用有不同约定,而且ST_DISTANCE_SPHERE这类空间函数对顺序极度敏感,一旦搞反,计算结果会完全偏离实际值。

一、创建POINT时的正确顺序

针对MariaDB 10.6.7和MySQL 8.0.28版本的测试表明,创建POINT时必须遵循经度在前,纬度在后的格式,才能得到正确的空间计算结果。

测试代码如下:

-- 正确顺序:经度 纬度
set @zenica   = ST_GeomFromText('POINT(17.907743 44.203438)');
set @sarajevo = ST_GeomFromText('POINT(18.413076 43.856258)');

-- 错误顺序:纬度 经度
set @zenica2   = ST_GeomFromText('POINT(44.203438 17.907743)');
set @sarajevo2 = ST_GeomFromText('POINT(43.856258 18.413076)');

-- 计算两地球面距离
SELECT ST_Distance_Sphere(@zenica, @sarajevo), ST_Distance_Sphere(@zenica2, @sarajevo2);
-- 结果:55878.59337591705    67103.51207765185

从结果可见,正确顺序计算出的距离约55.8公里,符合Zenica到Sarajevo的实际地理距离;而颠倒顺序后的结果约67.1公里,明显不符合实际。

二、查询POINT后的解析差异

当通过SQL查询返回POINT类型的二进制数据时,MySQL和MariaDB在解析后的字段顺序表现不同,需要开发者注意:

PHP环境下的解析示例:

$testCase = DB::select("SELECT ST_PointFromText('POINT(24.00 12.00)', 4326) AS samplePoint")[0];
$testUnpacked = unpack("lSRID/CByteOrder/lTypeInfo/dFirst/dSecond", $testCase->samplePoint);
var_dump($testUnpacked['First']);
# double(12) -- MySQL输出(对应输入的纬度值)
# double(24) -- MariaDB输出(对应输入的经度值)

输入的是POINT(经度 纬度)格式,但MySQL解析后First字段返回纬度,MariaDB则返回经度。处理二进制空间数据时,需根据使用的数据库类型调整解析逻辑,避免取值错误。

内容的提问来源于stack exchange,提问作者flexponsive

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 18:48:38