Microsoft ODBC 驅動程式 for SQL Server 的主要版本差異

本文說明 Microsoft ODBC Driver 18 for SQL Server 與版本 17 之間的破壞性變更。

大多數從版本 17 升級到 18 的應用程式會受到單一變更的影響:連線預設是加密的。 如果升級後應用程式停止連線,請先閱讀 預設加密行為

變更的摘要

Area 版本 17 版本 18 及以後版本
預設設定Encrypt no yes
Encrypt 公認的價值觀 yesno yes、、 noMandatoryOptionalStrict
加密模式 關著還是開 關、開或嚴格
伺服器憑證驗證 除非你要求加密,否則不會發生 這是預設發生的,因為加密本身就開啟了
連接字串關鍵字 基礎組 基礎集加上新關鍵字

加密方式變更

預設加密行為

在版本 17 中,除非你要求加密或伺服器要求加密,否則連線不會被加密。 在第 18 版及以後版本中,連線預設為加密狀態。

由於驅動程式在加密連線時會驗證伺服器憑證,因此連接自簽或不信任憑證的伺服器的應用程式,在版本 17 成功連線,失敗於版本 18。 失敗是憑證驗證錯誤,而非認證錯誤。

你有三種解決方式,依安全性從高到低排列:

  • 在客戶信任的伺服器上安裝憑證。 這個選項是推薦的,也是唯一同時保留加密和驗證的。
  • 保持加密狀態,並透過設定 HostNameInCertificateServerCertificate告訴驅動程式要驗證哪個名稱。
  • 關閉加密以恢復 17 版預設值,方法是在 連接字串 中加入Encrypt=no

注意事項

設定 TrustServerCertificate=yes 會保持連線加密,但會停用憑證驗證,使連線暴露於中間攻擊者攻擊的可能。 偏好可信憑證。

加密值

版本 17 僅 yes 接受 和 no。 第 18 版及以後版本接受這些數值,並新增三個數值:

價值 相當於 行為
Mandatory yes 連線是加密的。
Optional no 除非伺服器要求,否則連線不會被加密。
Strict 沒有 連線採用 TDS 8.0 加密。

Strict 沒有版本 17 的對應版本。 這是唯一選擇 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 無法識別:

Keyword Purpose
ConcatNullYieldsNull 控制串接空值是否會產生空值。
GetDataExtensions 控制驅動程式啟用的 SQLGetData 擴充功能。
HostNameInCertificate 指定伺服器 TLS 憑證中要驗證的主機名稱。
IpAddressPreference 指定驅動程式先嘗試的 IP 位址族群。
LongAsMax 將長資料型態映射到其 max 對應資料。
RetryExec 配置 針對失敗查詢的重試規則。
ServerCertificate 指定憑證檔案的路徑,用以驗證伺服器。

不同的 18 版本中引入了個別關鍵字。 關於引入每個關鍵字的版本,以及完整的關鍵字參考,請參見 ODBC DSN 與 連接字串 關鍵字