MySQL报错4107,ER_SRS_UNUSED_PROJ_PARAMETER_PRESENT问题排查和远程修复方法分享
- 问答
- 2026-01-11 14:37:32
- 4
你正在尝试向MySQL的空间参考系统(SRS)定义中添加一个或多个它不需要、也不认识的参数,可以想象成你给一个只需要姓名和年龄的系统提交了一份包含血型、爱好的详细表格,系统发现“血型”和“爱好”这两个字段它根本不处理,于是就报了这个错。
这个问题通常在你执行一些地理空间相关的操作时出现,比如使用ST_Transform函数转换几何图形的坐标系统,或者使用GDAL等工具向MySQL导入带有特定坐标系统的空间数据时,错误信息可能会明确告诉你是哪个参数不被识别,unused parameter ‘foo’ present in projection”。
问题根源
根据MySQL官方文档和社区用户的经验,这个问题的根源主要有以下几点:
-
MySQL与Proj库的版本不匹配:这是最常见的原因,MySQL内部使用一个叫做Proj的开源库来处理坐标转换,Proj库本身在不断发展,不同版本之间对坐标系统参数的定义可能会有增减,如果你服务器上的MySQL链接的是一个较老版本的Proj库(比如Proj 4.x),而你的坐标系统定义(通常来自一个
.prj文件或WKT字符串)是按照新版本Proj(如Proj 5.x, 6.x, 7.x+)的规范写的,那么新版本中引入的参数在老版本Proj看来就是“多余”的,从而触发4107错误。 -
SRS定义来源问题:你使用的空间参考系统定义字符串可能来自一个非常新的数据源,它包含了一些扩展的、非标准的或者MySQL当前版本尚未支持的参数。

-
手动定义SRS时的笔误:如果你是通过
CREATE SPATIAL REFERENCE SYSTEM语句手动创建SRS,可能在定义字符串中不小心加入了错误的参数名。
排查步骤
当遇到4107错误时,可以按照以下步骤进行排查:
-
确认错误详情:仔细阅读完整的错误信息,MySQL通常会指出是哪个具体的参数不被识别,unused parameter ‘axis’ present”或“unused parameter ‘towgs84’ present”,记下这个参数名,这是后续解决问题的关键线索。

-
检查MySQL和Proj版本:在MySQL客户端中执行以下命令来查看版本信息:
SELECT VERSION();
尝试查找与MySQL捆绑的Proj版本信息,这有时可以通过查看系统变量或使用
ST_开头的空间函数版本来间接判断,了解这两个版本能帮助你判断是否属于版本兼容性问题。 -
获取并检查有问题的SRS定义:你需要找到触发错误的那个坐标系统的定义,这个定义可能来自:
- 一个Shapefile的
.prj文件。 - 通过GDAL的
ogr2ogr工具导入时指定的参数。 - 数据库中原有几何列的SRS。
- 你手动执行的
CREATE SPATIAL REFERENCE SYSTEM语句。 将这个定义完整地拿出来检查,它通常是一个WKT(Well-Known Text)格式的字符串。
- 一个Shapefile的
远程修复方法

这里的“远程修复”通常指你无法直接操作数据库服务器(比如是云数据库服务),只能通过SQL命令来进行修复。
-
移除多余参数(最直接有效) 这是最常用的方法,既然错误是说存在未使用的参数,那么我们就手动创建一个新的SRS定义,把这个多余的参数去掉。
- 步骤:
a. 从错误信息或源文件中获取完整的、有问题的SRS定义字符串。
b. 根据错误提示,找到并删除那个“unused”的参数行,原定义中包含
AXIS[“Easting”, EAST], AXIS[“Northing”, NORTH],而你的MySQL版本不支持AXIS参数,那么就删除这两行。 c. 使用修改后的定义字符串,通过CREATE SPATIAL REFERENCE SYSTEM语句在MySQL中重新创建这个SRS。非常重要的一点是,你必须使用OR REPLACE子句,并且给这个SRS指定一个新的、不同的SRID号(比如在原SRID基础上加10000),不能直接覆盖系统内置的或已存在的定义。CREATE OR REPLACE SPATIAL REFERENCE SYSTEM 你的新SRID(2048) NAME ‘Custom_SRS_Without_Unused_Param’ DEFINITION ‘修改后的WKT字符串’;
- 优点:简单粗暴,通常能立即解决问题。
- 缺点:修改定义可能在某些极端情况下影响坐标转换的精度,需要确认移除的参数是否确实无关紧要。
- 步骤:
a. 从错误信息或源文件中获取完整的、有问题的SRS定义字符串。
b. 根据错误提示,找到并删除那个“unused”的参数行,原定义中包含
-
使用公认的、兼容的SRS定义 如果方法一不奏效,或者你不想自己修改定义,可以尝试寻找一个被广泛接受、且与你的MySQL版本兼容的该坐标系统的标准定义。
- 步骤:
a. 访问权威的空间参考系统网站,如EPSG数据库(https://epsg.io/)。
b. 输入你原本想使用的SRID(例如EPSG:3857),查找其WKT定义。
c. 尝试使用网站上提供的不同格式的WKT(如WKT1和WKT2),或者看看是否有针对旧版Proj的兼容性定义,选择较简单的“WKT1”格式成功率更高。
d. 将找到的兼容定义通过
CREATE SPATIAL REFERENCE SYSTEM语句(同样指定新的SRID)创建到你的MySQL中。 - 优点:使用的是标准定义,可靠性高。
- 缺点:可能需要多次尝试才能找到能用的定义。
- 步骤:
a. 访问权威的空间参考系统网站,如EPSG数据库(https://epsg.io/)。
b. 输入你原本想使用的SRID(例如EPSG:3857),查找其WKT定义。
c. 尝试使用网站上提供的不同格式的WKT(如WKT1和WKT2),或者看看是否有针对旧版Proj的兼容性定义,选择较简单的“WKT1”格式成功率更高。
d. 将找到的兼容定义通过
-
升级MySQL或Proj库(根治方法,但远程操作可能不可行) 如果确认是版本过旧导致的问题,最根本的解决方案是升级MySQL到更新版本,因为新版本的MySQL会捆绑更新版本的Proj库,从而原生支持更多的SRS参数,这对于远程数据库(如云数据库RDS)你可能没有直接升级系统软件的权限,需要联系云服务商或系统管理员来完成。
总结与建议
解决MySQL错误4107的过程就是一个“对齐”的过程:让你使用的空间参考系统定义与MySQL底层的Proj库版本对齐,对于远程修复,最实用的就是在你的数据库会话中,创建一个“清洁版”的、移除了不兼容参数的自定义SRS,然后在你的SQL语句(如ST_Transform)中使用这个新的SRID。
在执行任何创建操作前,务必先在测试环境进行验证,如果问题发生在生产环境,操作更要谨慎,如果上述方法都无法解决,建议将完整的错误信息和SRS定义提供给数据库管理员或寻求社区帮助,以便进行更深入的诊断。
本文由芮以莲于2026-01-11发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:http://waw.haoid.cn/wenda/78741.html
