从 Linux 或 macOS 连接
本文讨论如何创建与 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 和使用未经验证的加密。
无论 Encrypt 和 TrustServerCertificate的设置如何,服务器登录凭据(用户名和密码)都始终处于加密状态。 下面的表格显示了 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 开始,可以在连接字符串中指定 KeepAlive
和 KeepAliveInterval
关键字。
KeepAlive=<integer>
控制 TCP 通过发送 keep-alive 数据包尝试验证空闲连接是否仍保持原样的频率。 默认值为 30 秒。KeepAliveInterval=<integer>
确定在收到响应之前分隔 keep-alive 重新传输的时间间隔。 默认值为 1 秒。