phpMyAdmin中GIS字段显示乱码或NULL,因默认不识别POINT等类型,需用ST_AsText()转WKT格式(如POINT(116.404 39.915));字段为NULL时返回NULL;SRID信息需ST_AsWKT()拼接;查询须SELECT ST_AsText(geom)而非直接查字段。
phpMyAdmin里直接查GIS字段为什么显示乱码或NULL
因为phpmyadmin默认不识别mysql的gis类型(如 point、polygon),直接 select 字段名会返回二进制 blob 或空值,不是人能读的坐标。
必须用函数显式转成文本格式,最常用的是 ST_AsText()(注意大小写,MySQL 5.7+ 推荐用这个,旧版可能只认 AsText())。
-
ST_AsText()返回 WKT 格式,比如POINT(116.404 39.915),坐标顺序是 经度在前、纬度在后 - 如果字段是
NULL,ST_AsText()也返回NULL,不是空字符串,别误判为数据缺失 - 某些空间字段用了
SRID(比如 EPSG:4326),ST_AsText()默认不带 SRID 信息;需要带 SRID 就得用ST_AsWKT()+ 显式拼接
在SQL窗口里怎么写查询才能看到可读坐标
别直接 SELECT geom_col FROM table,要包一层转换函数。最简实用写法:
SELECT id, ST_AsText(location) AS wkt FROM places WHERE id = 123;
常见组合场景:
- 查多个点并限制精度(避免小数位太长):
ROUND(ST_X(location), 6)和ROUND(ST_Y(location), 6)分开取经纬度 - 查面数据(如行政区划)时,
ST_AsText()返回的POLYGON可能很长,加LEFT(ST_AsText(geom), 200)预览开头 - WHERE 条件里不能直接比 WKT 字符串,得用空间函数,比如
ST_Contains(province_geom, location),而不是ST_AsText(location) LIKE '%116%'
为什么用 ST_AsText 还是看不到坐标?检查这三点
不是函数写错,就是底层数据或配置有问题:
立即学习“PHP免费学习笔记(深入)”;
- 字段类型不是真正的 GIS 类型:用
SHOW COLUMNS FROM table LIKE 'geom'确认 Type 是point/polygon,不是varchar或blob - MySQL 版本太低(SELECT VERSION(), @@have_geometry,结果
have_geometry必须是YES - phpMyAdmin 版本太老(ST_* 函数支持不全;升级或改用命令行验证:
mysql -e "SELECT ST_AsText(POINT(1,2))"
导出坐标数据时容易丢精度或格式错乱
phpMyAdmin「导出」按钮默认用 CSV,但 WKT 字符串含括号、逗号、空格,CSV 解析器极易拆错列。
- 导出前务必勾选「用引号包裹字段内容」,否则
POLYGON((0 0,1 0,1 1,0 1,0 0))会被切成 5 列 - 想导成标准 GeoJSON?phpMyAdmin 不支持,得用
ST_AsGeoJSON()+ 手动拼字段,再复制粘贴到外部工具处理 - 大批量导出时,
ST_AsText()在大POLYGON上性能明显下降,可先用ST_Simplify(geom, 0.001)降点精度再转
真正麻烦的是坐标系隐含假设——ST_AsText() 从不告诉你当前用的是 WGS84 还是 GCJ02,得靠业务上下文或建表语句里的 SRID 值确认,这点最容易被忽略。











