当前位置:首页 > 问答 > 正文

MySQL报错4107,ER_SRS_UNUSED_PROJ_PARAMETER_PRESENT问题排查和远程修复方法分享

你正在尝试向MySQL的空间参考系统(SRS)定义中添加一个或多个它不需要、也不认识的参数,可以想象成你给一个只需要姓名和年龄的系统提交了一份包含血型、爱好的详细表格,系统发现“血型”和“爱好”这两个字段它根本不处理,于是就报了这个错。

这个问题通常在你执行一些地理空间相关的操作时出现,比如使用ST_Transform函数转换几何图形的坐标系统,或者使用GDAL等工具向MySQL导入带有特定坐标系统的空间数据时,错误信息可能会明确告诉你是哪个参数不被识别,unused parameter ‘foo’ present in projection”。

问题根源

根据MySQL官方文档和社区用户的经验,这个问题的根源主要有以下几点:

  1. MySQL与Proj库的版本不匹配:这是最常见的原因,MySQL内部使用一个叫做Proj的开源库来处理坐标转换,Proj库本身在不断发展,不同版本之间对坐标系统参数的定义可能会有增减,如果你服务器上的MySQL链接的是一个较老版本的Proj库(比如Proj 4.x),而你的坐标系统定义(通常来自一个.prj文件或WKT字符串)是按照新版本Proj(如Proj 5.x, 6.x, 7.x+)的规范写的,那么新版本中引入的参数在老版本Proj看来就是“多余”的,从而触发4107错误。

  2. SRS定义来源问题:你使用的空间参考系统定义字符串可能来自一个非常新的数据源,它包含了一些扩展的、非标准的或者MySQL当前版本尚未支持的参数。

    MySQL报错4107,ER_SRS_UNUSED_PROJ_PARAMETER_PRESENT问题排查和远程修复方法分享

  3. 手动定义SRS时的笔误:如果你是通过CREATE SPATIAL REFERENCE SYSTEM语句手动创建SRS,可能在定义字符串中不小心加入了错误的参数名。

排查步骤

当遇到4107错误时,可以按照以下步骤进行排查:

  1. 确认错误详情:仔细阅读完整的错误信息,MySQL通常会指出是哪个具体的参数不被识别,unused parameter ‘axis’ present”或“unused parameter ‘towgs84’ present”,记下这个参数名,这是后续解决问题的关键线索。

    MySQL报错4107,ER_SRS_UNUSED_PROJ_PARAMETER_PRESENT问题排查和远程修复方法分享

  2. 检查MySQL和Proj版本:在MySQL客户端中执行以下命令来查看版本信息:

    SELECT VERSION();

    尝试查找与MySQL捆绑的Proj版本信息,这有时可以通过查看系统变量或使用ST_开头的空间函数版本来间接判断,了解这两个版本能帮助你判断是否属于版本兼容性问题。

  3. 获取并检查有问题的SRS定义:你需要找到触发错误的那个坐标系统的定义,这个定义可能来自:

    • 一个Shapefile的.prj文件。
    • 通过GDAL的ogr2ogr工具导入时指定的参数。
    • 数据库中原有几何列的SRS。
    • 你手动执行的CREATE SPATIAL REFERENCE SYSTEM语句。 将这个定义完整地拿出来检查,它通常是一个WKT(Well-Known Text)格式的字符串。

远程修复方法

MySQL报错4107,ER_SRS_UNUSED_PROJ_PARAMETER_PRESENT问题排查和远程修复方法分享

这里的“远程修复”通常指你无法直接操作数据库服务器(比如是云数据库服务),只能通过SQL命令来进行修复。

  1. 移除多余参数(最直接有效) 这是最常用的方法,既然错误是说存在未使用的参数,那么我们就手动创建一个新的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字符串’;
    • 优点:简单粗暴,通常能立即解决问题。
    • 缺点:修改定义可能在某些极端情况下影响坐标转换的精度,需要确认移除的参数是否确实无关紧要。
  2. 使用公认的、兼容的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中。
    • 优点:使用的是标准定义,可靠性高。
    • 缺点:可能需要多次尝试才能找到能用的定义。
  3. 升级MySQL或Proj库(根治方法,但远程操作可能不可行) 如果确认是版本过旧导致的问题,最根本的解决方案是升级MySQL到更新版本,因为新版本的MySQL会捆绑更新版本的Proj库,从而原生支持更多的SRS参数,这对于远程数据库(如云数据库RDS)你可能没有直接升级系统软件的权限,需要联系云服务商或系统管理员来完成。

总结与建议

解决MySQL错误4107的过程就是一个“对齐”的过程:让你使用的空间参考系统定义与MySQL底层的Proj库版本对齐,对于远程修复,最实用的就是在你的数据库会话中,创建一个“清洁版”的、移除了不兼容参数的自定义SRS,然后在你的SQL语句(如ST_Transform)中使用这个新的SRID。

在执行任何创建操作前,务必先在测试环境进行验证,如果问题发生在生产环境,操作更要谨慎,如果上述方法都无法解决,建议将完整的错误信息和SRS定义提供给数据库管理员或寻求社区帮助,以便进行更深入的诊断。