在 Linux 環境下讓 PHP 連接 Microsoft SQL Server,歷來是棘手問題。傳統方案使用 FreeTDS + mssql 擴展(已在 PHP 7 移除),現代最佳實踐是 FreeTDS + PDO_DBLIB 或 Microsoft ODBC Driver + PDO_SQLSRV。本文詳細記錄 FreeTDS 方案的完整編譯安裝、配置與驗證流程,適用於連接 SQL Server 2008~2019。
| 方案 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
| FreeTDS + PDO_DBLIB | 開源、無專有驅動依賴、支援舊版 SQL Server | 配置複雜、TDS 版本需匹配、功能受限 | 舊專案維護、無法安裝微軟驅動的環境 |
| Microsoft ODBC Driver + PDO_SQLSRV | 官方支援、功能完整、效能最佳、支援 Always Encrypted | 需接受 EULA、特定發行版套件管理較麻煩 | 新專案、生產環境推薦 |
本文專注 FreeTDS 方案,微軟官方驅動請參考 官方文檔。
apt-get update
apt-get install -y freetds-bin freetds-dev tdsodbc
yum install -y epel-release
yum install -y freetds freetds-devel unixODBC unixODBC-devel
cd /usr/local/src
wget ftp://ftp.freetds.org/pub/freetds/stable/freetds-1.3.18.tar.gz
tar xzf freetds-1.3.18.tar.gz
cd freetds-1.3.18
./configure --prefix=/usr/local/freetds --with-tdsver=7.4 --enable-msdblib
make && make install
--with-tdsver=7.4:SQL Server 2012/2014/2016/2017/2019。舊版對應:7.3 (2008)、7.2 (2005)、7.0 (2000)。--enable-msdblib:啟用 MS db-lib 相容模式。編輯 /usr/local/freetds/etc/freetds.conf(或 /etc/freetds/freetds.conf):
[sqlserver]
host = 192.168.1.100
port = 1433
tds version = 7.4
client charset = UTF-8
; 可選:實例名稱(SQL Server Express)
; instance = SQLEXPRESS
; 可選:加密
; encryption = require
關鍵點:
tds version 必須與編譯時 --with-tdsver 一致,且匹配目標 SQL Server 版本。client charset = UTF-8 解決中文亂碼。[name] 區塊,PHP 連接時使用該名稱。# Ubuntu/Debian
apt-get install -y php-pdo-dblib
# CentOS/RHEL (需啟用 remi 源)
yum install -y php-pdo-dblib
./configure --with-pdo-dblib=/usr/local/freetds [其他選項...]
make && make install
驗證:php -m | grep pdo_dblib 應輸出 pdo_dblib。
<?php
$dsn = 'dblib:host=sqlserver;dbname=YourDatabase;charset=utf8';
$user = 'your_username';
$pass = 'your_password';
try {
$pdo = new PDO($dsn, $user, $pass, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
]);
echo "連接成功!\n";
$stmt = $pdo->query('SELECT @@VERSION');
echo "SQL Server 版本: " . $stmt->fetchColumn() . "\n";
} catch (PDOException $e) {
die("連接失敗: " . $e->getMessage());
}
?>
host=sqlserver 對應 freetds.conf 中的區塊名 [sqlserver]。host=192.168.1.100,但需在 freetds.conf 有 [global] 區塊或同名區塊。freetds.conf 取消註釋 dump file = /tmp/freetds.log,重現錯誤後查看日誌。freetds.conf 設定 client charset = UTF-8。NVARCHAR 而非 VARCHAR。charset=utf8。/etc/hosts 加入 IP 對應,或 DSN 直接用 IP。FreeTDS 對預存過程支援有限,複雜場景建議改用微軟官方驅動。
若需通用 ODBC 介面:
/etc/odbcinst.ini 註冊 FreeTDS 驅動。/etc/odbc.ini 定義 DSN。odbc_connect() 或 PDO::ODBC 連接。但 PDO_DBLIB 直連更簡單高效,一般無需此層。
FreeTDS 是 Linux 連接 SQL Server 的經典開源方案。關鍵在於 TDS 版本匹配、字符集設定、防火牆/網路通達。現代新專案強烈建議使用 Microsoft ODBC Driver 18 + PDO_SQLSRV,獲得完整功能支援與最佳效能。遷移時只需更換 DSN 前綴(sqlsrv:)與連接參數,業務代碼幾乎無需修改。