在 PHP 開發過程中,連接 Microsoft SQL Server (MSSQL) 時遇到查詢結果顯示亂碼,是許多開發者常面臨的棘手問題。這本質上是字元編碼不一致導致的。本文將系統整理三種行之有效的解決方案,並提供完整代碼範例,助你快速排除故障。
亂碼產生的根本原因在於:PHP 腳本編碼、資料庫儲存編碼、資料表/欄位編碼、連接層編碼、瀏覽器顯示編碼這五個環節中,任一環節編碼不一致即會導致資料解析錯誤。解決核心在於「全鏈路編碼統一」。
透過調整 PHP 核心配置文件,設定 MSSQL 擴展預設使用的字元集。此法一勞永逸,適合專案編碼統一為 GBK 或 UTF-8 的場景。
; 尋找並修改 php.ini 中的以下行(去掉分號啟用)
;mssql.charset = "ISO-8859-1"
mssql.charset = "GBK" ; 或根據專案需求設為 "UTF-8"
注意:修改後必須重啟 Web 伺服器(如 Apache/Nginx + PHP-FPM)方能生效。
若無法修改 php.ini,或專案中不同頁面編碼不一,可在讀取資料後、輸出前使用 iconv() 強制轉換。
<?php
// 假設資料庫儲存為 GB2312/GBK,頁面為 UTF-8
$data = iconv('GB2312', 'UTF-8', $row['field_name']);
// 若反向寫入資料庫
$sql_data = iconv('UTF-8', 'GB2312', $_POST['input']);
?>
此法雖靈活,但需在每個查詢/寫入點處理,維護成本較高。
在 Windows 平台,利用 COM 組件建立 ADODB.Connection,於連接瞬間指定 CP_UTF8,從驅動層解決編碼傳輸問題,最為穩健。
<?php
// 建立 ADO 連接,第三參數 CP_UTF8 指定 UTF-8 傳輸
$conn = new COM("ADODB.Connection", NULL, CP_UTF8) or die("Cannot start ADO");
// 連接字串範例 (SQL Server)
$conn->Open("Driver={SQL Server};Server=192.168.22.40;Database=sugarcrm_db;UID=sa;PWD=123456;");
// 執行查詢
$rs = $conn->Execute('SELECT * FROM accounts') or die("Error query");
// 輸出 HTML 表格
echo '<table border="1"><tr><th>ID</th><th>Title</th></tr>';
while (!$rs->EOF) {
echo '<tr>';
echo '<td>' . $rs->Fields['id']->Value . '</td>';
echo '<td>' . $rs->Fields['name']->Value . '</td>';
echo '</tr>';
$rs->MoveNext();
}
echo '</table>';
// 釋放資源
$rs->Close();
$conn->Close();
$rs = null;
$conn = null;
?>
完整頁面範例請參考上方代碼,已包含 <meta charset="utf-8"> 聲明。
utf8mb4)。SET NAMES utf8 (MySQL) 或使用 ADO CP_UTF8 (MSSQL)。<meta charset="utf-8">。遵循以上原則,PHP 操作 MSSQL 亂碼問題將不再困擾你的專案開發。