MySQL报错:FUNCTION stores.ST_Intersects不存在 求助
哎,这个报错我熟!FUNCTION stores.ST_Intersects does not exist 一般是几个常见原因导致的,咱们一步步排查解决:
1. 先确认你的MySQL版本
ST_Intersects 是MySQL 5.6及以上版本才正式引入的空间函数,如果你的版本低于5.6,那肯定找不到这个函数。可以跑这条命令快速查版本:
SELECT VERSION();
如果版本太低,要么升级MySQL,要么换用后面提到的替代方案。
2. 检查表的存储引擎
只有InnoDB和MyISAM存储引擎支持空间数据类型及相关函数。你可以查一下你的stores表用的是什么引擎:
SHOW CREATE TABLE stores;
如果是MEMORY、CSV这类不支持空间类型的引擎,得改成InnoDB(推荐)或者MyISAM:
ALTER TABLE stores ENGINE=InnoDB;
3. 确认gps字段的类型必须是空间类型
ST_Intersects的第二个参数必须是GEOMETRY(或其子类型,比如POLYGON、MULTIPOLYGON)类型的字段,不能是普通的字符串、文本类型。你可以查字段类型:
DESCRIBE stores;
如果gps是普通类型(比如VARCHAR),那得先把它改成空间类型,还要确保里面的数据是正确的WKT格式(比如POLYGON((x1 y1, x2 y2, ...))),再执行修改:
-- 如果是单个多边形用POLYGON ALTER TABLE stores MODIFY COLUMN gps POLYGON; -- 如果是多个多边形集合用MULTIPOLYGON ALTER TABLE stores MODIFY COLUMN gps MULTIPOLYGON;
4. 修正查询语法的小细节
有时候可能是语法小错误导致的:
- 确认
Point()的参数顺序:MySQL里Point(lng, lat)是正确的(对应x轴经度,y轴纬度),别搞反了; - 检查函数名拼写:有没有写成
ST_Intersect少了末尾的s? - 如果确认版本够但还是报错,试试用
ST_Contains替代——点在多边形范围内的场景下,ST_Contains(gps, Point($lng, $lat))和ST_Intersects的效果几乎一致(除非点刚好在边界上),而且它和ST_Intersects是同版本引入的:
SELECT ST_Contains(gps, Point($lng, $lat)) AS isInside FROM stores;
5. 检查是否启用了空间扩展
虽然现在MySQL默认安装会包含空间扩展,但有些精简版安装可能漏掉了。你可以跑这条命令确认:
SHOW PLUGINS LIKE 'mysql%spatial';
如果没看到相关插件,得重新安装或手动启用空间扩展。
内容的提问来源于stack exchange,提问作者Kodr.F
相关产品推荐
相关产品推荐

