SQL Server 2022链接MySQL时MSDASQL元数据不一致问题求助
问题背景
我们原本使用SQL Server 2012与Ubuntu上的MySQL Server 8.0.35,现已将SQL Server迁移至2022版本(Windows Server 2022),MySQL服务器保持不变。现在使用Linked Server连接MySQL时,多数查询无法正常运行,报错信息如下:
OLE DB provider 'MSDASQL' supplied inconsistent metadata for a column. the tstamp-column (compile-time ordinal 4) of object "DatabaseName"."SchemaName"."ColumnName" was reported to have a "DBTYPE" of 3 at compile time and 19 at run time.
该列数据类型为unsigned int,查阅MySQL Connector文档得知unsigned int应映射为SQL_INTEGER,但当前映射出现偏差。已尝试过MySQL Connector ODBC 8.0.25(与原SQL Server 2012使用版本一致)、8.0.32及8.2.0版本。已知OPENQUERY可部分解决问题,但现有大量复杂语句无法全部适配,需其他解决方案。
解决方案
调整ODBC数据源的类型映射配置
- 打开对应位数的ODBC数据源管理器(SQL Server 2022为64位),找到连接MySQL的数据源,进入配置界面。
- 进入「详细配置」的「Advanced」标签页,添加或修改以下键值对:
OPT_INSENSITIVE_CHAR=1:统一字符类型处理逻辑USE_MYSQL_TYPE=1:强制使用MySQL原生类型映射规则,避免ODBC自动转换偏差UNSIGNED=1:显式指定unsigned类型的映射规则,确保unsigned int被正确识别为SQL_INTEGER
- 保存配置后,重新测试Linked Server查询。
修改Linked Server的属性设置
- 在SQL Server Management Studio中找到目标Linked Server,右键选择「属性」。
- 进入「服务器选项」页面,修改以下设置:
- 将「Collation Compatible」设为
True:让SQL Server认为Linked Server的排序规则与本地兼容,减少元数据校验冲突 - 确保「Data Access」「RPC」「RPC Out」均设为
True:保障数据访问和远程调用的正常执行 - 将「Use Remote Collation」设为
False:强制使用本地SQL Server的排序规则处理元数据
- 将「Collation Compatible」设为
- 应用设置后,执行
sp_refreshlinkedserver 'LinkedServerName'刷新Linked Server配置。
自定义类型映射(注册表修改)
- 打开注册表编辑器,定位到MySQL ODBC驱动的注册表路径(64位驱动通常在
HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\MySQL ODBC 8.0 Unicode Driver)。 - 添加字符串值
TypeCompatibility,设置值为8.0:强制驱动使用与SQL Server更兼容的类型映射逻辑,优先将unsigned int映射为SQL_INTEGER。 - 修改后重启SQL Server服务,确保配置生效。
临时应急方案(针对特定列)
若全局配置无法立即生效,可对报错列进行显式类型转换,在查询中使用CAST或CONVERT适配SQL Server类型:
SELECT CAST(RemoteTable.tstamp AS INT) AS tstamp FROM LinkedServerName.DatabaseName.SchemaName.RemoteTable
该方式无需修改全局配置,可快速解决单个查询的问题,适合逐步过渡。
内容的提问来源于stack exchange,提问作者halliballi

