首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

Linux 下 PHP 連接 Microsoft SQL Server 完整指南(FreeTDS + PDO)

     編輯:PHP 相關知識

前言

在 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 方案,微軟官方驅動請參考 官方文檔。

步驟 1:安裝 FreeTDS

Ubuntu/Debian

apt-get update
apt-get install -y freetds-bin freetds-dev tdsodbc

CentOS/RHEL/Rocky/AlmaLinux

yum install -y epel-release
yum install -y freetds freetds-devel unixODBC unixODBC-devel

源碼編譯(指定 TDS 版本)

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 相容模式。

步驟 2:配置 FreeTDS

編輯 /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 連接時使用該名稱。

步驟 3:安裝 PHP PDO_DBLIB 擴展

使用套件管理器

# Ubuntu/Debian
apt-get install -y php-pdo-dblib

# CentOS/RHEL (需啟用 remi 源)
yum install -y php-pdo-dblib

源碼編譯 PHP 時啟用

./configure --with-pdo-dblib=/usr/local/freetds [其他選項...]
make && make install

驗證:php -m | grep pdo_dblib 應輸出 pdo_dblib。

步驟 4:PHP 連接測試

<?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]。
  • 若直接用 IP,DSN 寫 host=192.168.1.100,但需在 freetds.conf 有 [global] 區塊或同名區塊。

常見問題排查

1. 連接超時 / 無法連接

  • 檢查防火牆:SQL Server 1433 埠是否開放。
  • SQL Server 設定管理器 → 網路配置 → TCP/IP 啟用,IPAll 埠設為 1433。
  • FreeTDS 日誌:編輯 freetds.conf 取消註釋 dump file = /tmp/freetds.log,重現錯誤後查看日誌。

2. 中文亂碼

  • 確保 freetds.conf 設定 client charset = UTF-8。
  • 資料庫欄位使用 NVARCHAR 而非 VARCHAR。
  • PDO DSN 加入 charset=utf8。

3. "Adaptive Server connection failed"

  • TDS 版本不匹配:嘗試 7.3、7.2、7.1、8.0。
  • 主機名解析失敗:在 /etc/hosts 加入 IP 對應,或 DSN 直接用 IP。

4. 預存過程/輸出參數問題

FreeTDS 對預存過程支援有限,複雜場景建議改用微軟官方驅動。

進階:使用 unixODBC + FreeTDS (可選)

若需通用 ODBC 介面:

  1. 配置 /etc/odbcinst.ini 註冊 FreeTDS 驅動。
  2. 配置 /etc/odbc.ini 定義 DSN。
  3. PHP 用 odbc_connect() 或 PDO::ODBC 連接。

但 PDO_DBLIB 直連更簡單高效,一般無需此層。

總結

FreeTDS 是 Linux 連接 SQL Server 的經典開源方案。關鍵在於 TDS 版本匹配、字符集設定、防火牆/網路通達。現代新專案強烈建議使用 Microsoft ODBC Driver 18 + PDO_SQLSRV,獲得完整功能支援與最佳效能。遷移時只需更換 DSN 前綴(sqlsrv:)與連接參數,業務代碼幾乎無需修改。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved