PHP 連接 SQL Server 時出現亂碼,本質是字符集不匹配。涉及數據庫、表、字段、PHP 文件、連接層、輸出頁面六個環節,任一環節編碼不一致即會導致亂碼。本文提供四種針對性解決方案及完整排查清單。
;mssql.charset = "ISO-8859-1"
mssql.charset = "GBK" ; 或 UTF-8,視頁面編碼而定
修改後需重啟 Apache/ PHP-FPM 生效。適用於所有 mssql_* 函數連接。
$data = iconv('GB2312', 'UTF-8', $data);
// 或
$data = mb_convert_encoding($data, 'UTF-8', 'GBK');
靈活控制單個字段或查詢結果,適合無法修改 php.ini 的虛擬主機環境。
$conn = new COM("ADODB.Connection", NULL, CP_UTF8) or die("Cannot start ADO");
$conn->Open("Driver={SQL Server};Server=192.168.22.40;Database=sugarcrm_db;UID=sa;PWD=123456;");
COM 組件方式連接時,第三個參數 CP_UTF8 強制使用 UTF-8 代碼頁,從連接層解決編碼問題。
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<?php
$conn = new COM("ADODB.Connection", NULL, CP_UTF8) or die("Cannot start ADO");
$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");
?>
<table border="1">
<tr><th>ID</th><th>Title</th></tr>
<?php
while (!$rs->EOF) {
echo '<tr>';
echo '<td>' . $rs->Fields['id']->Value . '</td>';
echo '<td>' . $rs->Fields['name']->Value . '</td>';
echo '</tr>';
$rs->MoveNext();
}
?>
</table>
<?php
$rs->Close(); $conn->Close(); $rs = null; $conn = null;
?>
</body>
</html>
SET NAMES utf8(MySQL習慣)或對應 MSSQL 設置碼頁。「源頭統一、傳輸指定、輸出聲明」三步走,徹底解決 PHP-MSSQL 亂碼。優先推薦方案三(ADO+CP_UTF8)或升級至 sqlsrv 驅動,避免層層轉碼帶來的性能損耗與維護成本。