Microsoft ODBC 驱动 for SQL Server 的主要版本差异

本文介绍了Microsoft ODBC Driver 18 for SQL Server与版本17之间的破坏性变更。

大多数从版本17升级到版本18的应用程序只会受到一个变化的影响:连接默认加密。 如果升级后应用停止连接,先阅读 默认加密行为

更改摘要

区域 版本 17 版本18及以后版本
默认 Encrypt 设置 no yes
Encrypt 公认的价值观 yesno yesnoMandatoryOptionalStrict
加密模式 开着还是开 关、开或严
服务器证书验证 除非你请求加密,否则不会发生 这是默认的,因为加密默认开启
连接字符串关键字 基础套装 基础集加上新关键词

加密更改

默认加密行为

在版本17中,除非你要求加密或服务器要求加密,否则连接不会加密。 在18版及以后版本中,连接默认加密。

由于驱动程序在加密连接时会验证服务器证书,因此连接自签名或其他不信任证书的应用程序在版本17时成功连接,在版本18时失败。 失败是证书验证错误,而非认证错误。

你有三种解决方式,从安全程度到安全性排序:

  • 在客户端信任的服务器上安装证书。 这是推荐的选项,也是唯一同时保持加密和验证的。
  • 保持加密状态,并通过设置 HostNameInCertificateServerCertificate告诉驱动程序验证哪个名称。
  • 关闭加密可恢复17版默认值,方法是添加Encrypt=no连接字符串(连接字符串)。

注意

设置 TrustServerCertificate=yes 保持连接加密,但禁用证书验证,使连接暴露于中间攻击者攻击的可能。 更倾向于使用可信证书。

加密值

版本17只 yes 接受和 no。 第18版及以后版本接受这些数值,并增加了三个:

价值 等效于 Behavior
Mandatory yes 连接是加密的。
Optional no 除非服务器要求,否则连接不会加密。
Strict 没有 该连接采用TDS 8.0加密。

Strict 没有版本17的对应版本。 这是唯一选择TDS 8.0的数值,TDS 8.0在登录交换前协商加密,而非登录时。

恢复17版加密行为

要恢复17版默认行为,请明确设置 Encrypt

Driver={ODBC Driver 18 for SQL Server};Server=<server>;Database=<database>;UID=<user_id>;PWD=<password>;Encrypt=no;

即使在版本17上,明确设置该值也很有益,因为这使连接字符串在两个版本中表现相同。

新的 连接字符串 关键字

版本18增加了以下连接字符串关键词,而版本17无法识别:

关键 字 Purpose
ConcatNullYieldsNull 控制连接空值是否会得到空值。
GetDataExtensions 控制驱动启用的 SQLGetData 扩展。
HostNameInCertificate 指定主机名称,在服务器的TLS证书中验证。
IpAddressPreference 指定驱动程序首先尝试的IP地址家族。
LongAsMax 将长数据类型映射到其 max 对应数据。
RetryExec 配置 针对失败查询的重试规则。
ServerCertificate 指定用于验证服务器的证书文件路径。

不同的18版版本引入了单独的关键词。 关于引入每个关键词的版本,以及完整的关键词参考,请参见 ODBC DSN 和 连接字符串 关键字