资讯动态

MySQL 冷门数据类型:聊聊很多人一辈子不会用到的 GEOMETRY

发布时间:2026/10/2 7:13:51 来源:尧图企业网站定制
标签MySQL、数据库、空间数据、冷门数据类型前言平时开发业务系统大家打交道最多的就是INT、VARCHAR、DECIMAL、DATETIME这些类型。很多人写了好几年SQL甚至不知道MySQL还内置了一套空间数据类型。空间类型里POINT还算偶尔有人听过但GEOMETRY作为所有空间类型的父类就属于典型的不常用但很有意思的数据类型。今天就专门讲讲它。什么是 GEOMETRYMySQL从5.6版本开始完善空间数据支持8.0做了大量优化。GEOMETRY是一个通用几何类型它可以存放任意一种空间几何对象点 POINT线 LINESTRING多边形 POLYGON多点 MULTIPOINT多线 MULTILINESTRING多多边形 MULTIPOLYGON几何集合 GEOMETRYCOLLECTION简单一句话POINT只能存坐标点而GEOMETRY字段同一个表里的不同行可以一会儿存点、一会儿存线、一会儿存多边形。这就是它和其他空间类型最大的区别。适用场景一句话总结当一行数据不确定是点/线/面多种几何图形混存的时候才选 GEOMETRY。基础建表 写入示例创建一张包含GEOMETRY字段的表CREATETABLEgeo_test(idINTPRIMARYKEYAUTO_INCREMENT,nameVARCHAR(100),geo_dataGEOMETRYNOTNULL,-- 可选创建空间索引空间查询必备SPATIALINDEXidx_geo(geo_data));插入一条点数据INSERTINTOgeo_test(name,geo_data)VALUES(重庆某点位,ST_GeomFromText(POINT(106.55 29.56)));再插入一个多边形区域同一张表同一个字段直接换类型INSERTINTOgeo_test(name,geo_data)VALUES(某区域多边形,ST_GeomFromText(POLYGON((106 29,107 29,107 30,106 30,106 29))));查询 GEOMETRY 字段直接SELECT拿到的是二进制存储格式人看不懂要用ST_AsText()转成可读WKT文本SELECTid,name,ST_AsText(geo_data)FROMgeo_test;判断类型用ST_GeometryType()就能看出当前这条记录存的是点还是多边形SELECTid,name,ST_GeometryType(geo_data)ASgeom_type,ST_AsText(geo_data)ASwktFROMgeo_test;常用空间函数举例ST_Contains(a,b)判断几何A是否包含B常用于判断坐标是否落在区域内ST_Distance()计算两个几何对象之间的距离ST_GeomFromText()WKT文本转为GEOMETRY二进制ST_AsText()二进制转回WKT可读文本什么时候该用 GEOMETRY什么时候别用✅ 适合场景一套表里面同时存储点、线段、多边形多种地理图形类型不固定。比如地图后台既存点位标记又存围栏区域。通用空间数据存储统一入库上层业务再判断几何类型做不同渲染。❌ 不推荐场景绝大多数业务只存经纬度坐标点直接用POINT性能更好约束更强不应该上GEOMETRY。高并发、超大表空间索引开销不小很多业务会把地理计算交给Redis/GIS服务PostGIS、高德/百度地图API不在MySQL里做复杂空间运算。简单业务后台没有地图需求完全没必要引入增加团队理解成本。容易踩的坑旧版本MySQL坑5.6之前空间类型支持很差不要在老版本线上库随便玩。推荐MySQL8.0。SPATIAL索引限制如果字段允许NULL部分版本空间索引会有问题且只有GEOMETRY、POINT这类空间类型支持空间索引普通字段不行。坐标系问题默认是笛卡尔平面坐标不是地理球面坐标如果要做真实地球经纬度距离计算需要指定SRID8.0支持SRID推荐SRID4326也就是WGS84GPS通用坐标系。-- 带SRID的写法ST_GeomFromText(POINT(106.55 29.56),4326)不要拿GEOMETRY替代VARCHAR存WKT字符串很多新手图省事直接把WKT文本放进VARCHAR就失去了空间索引、空间函数能力反过来如果你不需要空间计算单纯存文本也没必要用GEOMETRY。和 POINT 的直观对比类型可存储几何对象使用场景POINT仅坐标点经纬度点位最常用的空间类型GEOMETRY点、线、多边形、几何集合全部支持多种几何类型混存通用GIS数据写在最后GEOMETRY在普通业务开发里确实属于冷门选手。绝大多数项目存经纬度用POINT甚至直接两个DECIMAL字段分开存lng/lat就够用。但如果你做地图后台、电子围栏、地理信息相关系统它就有发挥空间。不过实际生产中很多GIS项目会单独使用PostgreSQLPostGIS而不是重度依赖MySQL的空间能力。简单总结知道有这个东西看懂它能干啥不到多种几何混存的场景尽量不用。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑