从 Linux 或 macOS 连接

下载 ODBC 驱动程序

本文讨论如何创建与 SQL Server 数据库的连接。

连接属性

有关 Linux 和 macOS 上支持的所有连接字符串关键字和属性,请参阅 DSN 和连接字符串关键字和属性

重要

当连接到使用数据库镜像(有一个故障转移伙伴)的数据库时,不要在连接字符串中指定数据库名称。 应发送 use database_name 命令连接到该数据库,然后再执行查询。

传递给 Driver 关键字的值可以是下列值之一:

  • 安装该驱动程序时使用的名称。

  • 已在用于安装驱动程序的模板 .ini 文件中指定的该驱动程序库的路径。

DSN 是可选的。 你可以使用 DSN 在 DSN 名称下定义连接字符串关键字,然后可以在连接字符串中引用该关键字。 若要创建 DSN,请创建(如有必要)并编辑文件 ~/.odbc.ini(主目录中的 .odbc.ini)(针对仅当前用户可访问的用户 DSN)或 /etc/odbc.ini(针对系统 DSN)(需要管理权限。)以下 odbc.ini 示例显示了 DSN 所需的最少条目:

# [DSN name]
[MSSQLTest]  
Driver = ODBC Driver 18 for SQL Server  
# Server = [protocol:]server[,port]  
Server = tcp:localhost,1433
Encrypt = yes
#
# Note:  
# Port isn't a valid keyword in the odbc.ini file  
# for the Microsoft ODBC driver on Linux or macOS
#  

若要在连接字符串中使用上述 DSN 进行连接,请指定 DSN 关键字,例如:DSN=MSSQLTest;UID=my_username;PWD=my_password
上述连接字符串等效于指定一个不带 DSN 关键字的连接字符串,例如:Driver=ODBC Driver 18 for SQL Server;Server=tcp:localhost,1433;Encrypt=yes;UID=my_username;PWD=my_password

你可以选择指定协议和端口来连接到服务器。 例如,Server=tcp:servername,12345。 Linux 和 macOS 驱动程序支持的唯一协议是 tcp

若要连接到静态端口上的命名实例,请使用 Server=servername,port_number。 在 17.4 版之前,不支持连接到动态端口。

可以选择将 DSN 信息添加到模板文件并执行以下命令,以将其添加到 ~/.odbc.ini

odbcinst -i -s -f <template_file>

有关 ini 文件和 odbcinst 的完整文档,请参阅 unixODBC 文档。 有关 odbc.ini 文件中特定于 ODBC Driver for SQL Server 的条目,请参阅 DSN 和连接字符串关键字和属性,以了解 Linux 和 macOS 中支持的关键字和属性。

可以使用 isql 测试连接来验证驱动程序是否正在运行,也可以使用以下命令:

bcp master.INFORMATION_SCHEMA.TABLES out OutFile.dat -S <server> -U <name> -P <password>

使用 TLS/SSL

你可以使用传输层安全性 (TLS)(以前称为安全套接字层 (SSL))来加密与 SQL Server 的连接。 TLS 通过网络保护 SQL Server 用户名和密码。 TLS 还验证服务器的身份以防止中间人 (MITM) 攻击。

启用加密可提高安全性,但会降低性能。

有关更多信息,请参阅加密连接到 SQL Server使用未经验证的加密

无论 EncryptTrustServerCertificate的设置如何,服务器登录凭据(用户名和密码)都始终处于加密状态。 下面的表格显示了 Encrypt 和 TrustServerCertificate 设置的效果。

ODBC Driver 18 和更高版本

加密设置 信任服务器证书 服务器强制加密 结果
No 不检查服务器证书。
在客户端和服务器之间发送的数据没有加密。
不检查服务器证书。
在客户端和服务器之间发送的数据没有加密。
No 检查服务器证书。
在客户端和服务器之间发送的数据已加密。
不检查服务器证书。
在客户端和服务器之间发送的数据已加密。
No 检查服务器证书。
在客户端和服务器之间发送的数据已加密。
不检查服务器证书。
在客户端和服务器之间发送的数据已加密。
检查服务器证书。
在客户端和服务器之间发送的数据已加密。
不检查服务器证书。
在客户端和服务器之间发送的数据已加密。
严格 - - 将忽略 TrustServerCertificate。 检查服务器证书。
在客户端和服务器之间发送的数据已加密。

注意

“严格”仅适用于支持 TDS 8.0 连接的服务器。

ODBC Driver 17 及更低版本

加密设置 信任服务器证书 服务器强制加密 结果
No 不检查服务器证书。
在客户端和服务器之间发送的数据没有加密。
不检查服务器证书。
在客户端和服务器之间发送的数据没有加密。
No 检查服务器证书。
在客户端和服务器之间发送的数据已加密。
不检查服务器证书。
在客户端和服务器之间发送的数据已加密。
No 不检查服务器证书。
在客户端和服务器之间发送的数据已加密。
不检查服务器证书。
在客户端和服务器之间发送的数据已加密。
检查服务器证书。
在客户端和服务器之间发送的数据已加密。
不检查服务器证书。
在客户端和服务器之间发送的数据已加密。

使用连接加密时,SQL Server TLS/SSL 证书中的使用者公用名 (CN) 或使用者可选名称 (SAN) 中的名称(或 IP 地址)应与连接字符串中指定的服务器名称(或 IP 地址)完全匹配。 HostnameInCertificate 关键字 (v18.0+) 可用于指定与 TLS/SSL 证书中的名称匹配的备用名称。 指定关键字时,SQL Server TLS/SSL 证书必须与服务器名称之一或 HostnameInCertificate 相匹配。

默认情况下,加密的连接会始终验证服务器的证书。 但是,如果你连接到具有自签名证书的服务器,并且没有使用严格加密模式,则可以添加 TrustServerCertificate 选项,以绕过针对受信任的证书颁发机构列表的证书检查:

Driver={ODBC Driver 18 for SQL Server};Server=ServerNameHere;Encrypt=YES;TrustServerCertificate=YES  

在严格加密模式下,始终验证证书。 作为标准证书验证的选项,ServerCertificate 关键字 (v18.1+) 可用于指定证书文件的路径,以便与 SQL Server 证书匹配。 只有使用严格加密时,此选项才可用。 接受的证书格式为 PEM、DER 和 CER。 如果指定,则通过查看提供的 ServerCertificate 是否完全匹配来检查 SQL Server 证书。

Linux 和 macOS 上的 TLS 使用 OpenSSL 库。 下表显示了 OpenSSL 的受支持的最低版本和每个平台的默认证书信任存储位置:

平台 最低的 OpenSSL 版本 默认证书信任存储位置
Debian 10、11、12 1.1.1 /etc/ssl/certs
Debian 9 1.1.0 /etc/ssl/certs
Debian 8.71 1.0.1 /etc/ssl/certs
OS X 10.11、macOS 1.0.2 /usr/local/etc/openssl/certs
Red Hat Enterprise Linux 9 3.0.1 /etc/pki/tls/cert.pem
Red Hat Enterprise Linux 8 1.1.1 /etc/pki/tls/cert.pem
Red Hat Enterprise Linux 7 1.0.1 /etc/pki/tls/cert.pem
Red Hat Enterprise Linux 6 1.0.0-10 /etc/pki/tls/cert.pem
SUSE Linux Enterprise 15 1.1.0 /etc/ssl/certs
SUSE Linux Enterprise 11、12 1.0.1 /etc/ssl/certs
Ubuntu 22.04,23.04 3.0.2 /etc/ssl/certs
Ubuntu 20.04 1.1.1 /etc/ssl/certs
Ubuntu 18.04 1.1.0 /etc/ssl/certs
Ubuntu 16.04 1.0.2 /etc/ssl/certs
Ubuntu 14.04 1.0.1 /etc/ssl/certs
Alpine 3.17,3.18 3.0.1 /etc/ssl/certs

使用 SQLDriverConnect 进行连接时,还可以使用 Encrypt 选项在连接字符串中指定加密。

调节 TCP Keep-Alive 设置

从 ODBC Driver 17.4 开始,如果没有收到响应,驱动程序发送 keep-alive 数据包并将其重新发送的频率是可配置的。 若要进行配置,请将以下设置添加到 odbcinst.ini 的驱动程序部分,或者添加到 odbc.ini 的 DSN 部分。 当连接到 DSN 时,驱动程序将使用 DSN 部分中的设置(如果存在);否则,如果只连接一个连接字符串,它将使用 odbcinst.ini 的驱动程序部分中的设置。 如果这两个位置中不存在该设置,则驱动程序将使用默认值。 从 ODBC 驱动程序 17.8 开始,可以在连接字符串中指定 KeepAliveKeepAliveInterval 关键字。

  • KeepAlive=<integer> 控制 TCP 通过发送 keep-alive 数据包尝试验证空闲连接是否仍保持原样的频率。 默认值为 30 秒。

  • KeepAliveInterval=<integer> 确定在收到响应之前分隔 keep-alive 重新传输的时间间隔。 默认值为 1 秒。

另请参阅