PHP 5.3+ Windows 移除 mssql 擴充,官方建議用 sqlsrv;Linux 下則使用 FreeTDS + mssql 或 pdo_dblib 連接 SQL Server。
wget ftp://ftp.freetds.org/pub/freetds/stable/freetds-1.3.12.tar.gz
tar zxvf freetds-1.3.12.tar.gz
cd freetds-1.3.12
./configure --prefix=/usr/local/freetds --with-tdsver=7.2
make && make install
關鍵點:--with-tdsver=7.2 對應 SQL Server 2005(TDS 7.2)。網上常見 8.0 是 SQL Server 2000,會導致連線失敗。
cd /path/to/php-source
./configure --prefix=/usr/local/php --with-mssql=/usr/local/freetds ...(其他原有參數)
make && make install
編輯 /usr/local/freetds/etc/freetds.conf:
[egServer72]
host = 192.168.1.100 # SQL Server IP 或主機名
port = 1433
tds version = 7.2
client charset = UTF-8 # 解決中文亂碼
<?php
$conn = mssql_connect('egServer72', 'sa', 'password'); // 注意:用 freetds.conf 的名稱,非 IP
if (!$conn) die('連線失敗: ' . mssql_get_last_message());
mssql_select_db('MyDatabase', $conn);
$result = mssql_query('SELECT TOP 10 * FROM Users', $conn);
while ($row = mssql_fetch_assoc($result)) {
print_r($row);
}
mssql_close($conn);
?>
| 問題 | 原因 | 解決 |
|---|---|---|
| 連線逾時 | 防火牆阻擋 1433、SQL Server 未啟用 TCP/IP | 開放端口、SQL Server Configuration Manager 啟用 TCP/IP |
| 中文亂碼 | 字元集不匹配 | freetds.conf 加 client charset = UTF-8、資料庫欄位用 NVARCHAR |
| mssql_connect 未定義 | PHP 未編譯 --with-mssql 或未載入擴充 | 檢查 phpinfo()、php.ini 載入 mssql.so |
| TDS 版本錯誤 | FreeTDS 編譯版本與 SQL Server 不符 | 重編 FreeTDS 指定正確 --with-tdsver |
pdo_sqlsrv,舊專案維護才用 mssql/dblib。FreeTDS 是 Linux 連接舊版 SQL Server 的經典方案。關鍵在於:TDS 版本對應正確、freetds.conf 使用邏輯名稱連線、字元集統一 UTF-8。掌握這三點,即可穩定打通 PHP 與 SQL Server 2005/2008/2012 等版本。