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
相关产品推荐
相关产品推荐

