Ubuntu22.04用ODBC Driver18连SQL Server2016遇0x2746错误求助
解决Ubuntu 22.04下ODBC Driver 18连接SQL Server 2016的0x2746错误
错误[08001][Microsoft][ODBC Driver 18 for SQL Server]TCP Provider: Error code 0x2746本质是TLS握手失败,核心原因是Ubuntu22.04默认的OpenSSL 3.x与SQL Server 2016的TLS套件/加密配置不兼容,且ODBC Driver 18默认启用严格加密验证规则。以下是三种可行解决方案:
方案1:修改连接字符串(无需更换OpenSSL,推荐)
ODBC Driver 18默认将Encrypt设为Strict,会强制验证服务器证书并使用现代TLS套件,而SQL Server 2016对这些配置支持有限。只需在连接字符串中添加适配参数:
Encrypt=Optional:允许非加密连接,或在服务器支持时自动加密(适合内部测试环境)TrustServerCertificate=Yes:跳过证书验证,保留加密连接(适合使用自签证书的场景)- 可选追加
TLS_Version=TLS1.2:强制使用SQL Server 2016支持的TLS版本
示例连接字符串:
Driver={ODBC Driver 18 for SQL Server};Server=tcp:xxxx,1433;Database=xxx;UID=xxx;PWD=xxx;Encrypt=Optional;
或:
Driver={ODBC Driver 18 for SQL Server};Server=tcp:xxxx,1433;Database=xxx;UID=xxx;PWD=xxx;TrustServerCertificate=Yes;TLS_Version=TLS1.2;
方案2:强制ODBC驱动加载指定的OpenSSL 1.0.1k库
如果必须使用加密且依赖旧版OpenSSL,可以通过以下方式让驱动优先加载你编译的OpenSSL 1.0.1k:
临时生效(单次连接)
在执行连接命令前设置环境变量,指定OpenSSL库路径(假设你将OpenSSL 1.0.1k安装在/usr/local/openssl-1.0.1k):
export LD_LIBRARY_PATH=/usr/local/openssl-1.0.1k/lib:$LD_LIBRARY_PATH # 执行连接命令 isql -v "你的DSN名称" # 或用sqlcmd sqlcmd -S tcp:xxxx,1433 -U xxx -P xxx -d xxx
永久生效(修改驱动二进制文件)
使用patchelf工具修改ODBC驱动的加载路径,让它优先读取指定的OpenSSL库:
- 安装patchelf:
sudo apt install patchelf
- 找到ODBC Driver 18的核心库文件,通常路径为
/opt/microsoft/msodbcsql18/lib64/libmsodbcsql-18.3.so.2.1 - 修改其rpath:
sudo patchelf --set-rpath /usr/local/openssl-1.0.1k/lib:/opt/microsoft/msodbcsql18/lib64 /opt/microsoft/msodbcsql18/lib64/libmsodbcsql-18.3.so.2.1
方案3:降级到ODBC Driver 17 for SQL Server
ODBC Driver 17对旧版SQL Server和OpenSSL的兼容性更好,适合长期使用:
- 卸载当前的ODBC Driver 18(可选):
sudo apt remove msodbcsql18
- 安装ODBC Driver 17:
sudo curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add - sudo curl https://packages.microsoft.com/config/ubuntu/22.04/prod.list | sudo tee /etc/apt/sources.list.d/mssql-release.list sudo apt update sudo ACCEPT_EULA=Y apt install msodbcsql17
- 使用Driver 17的连接字符串:
Driver={ODBC Driver 17 for SQL Server};Server=tcp:xxxx,1433;Database=xxx;UID=xxx;PWD=xxx;
内容的提问来源于stack exchange,提问作者BigLeo
相关产品推荐
相关产品推荐

