使用 PHP mssql 擴展連接 SQL Server 時,ntext、nvarchar(max) 欄位查詢結果為空白,不報錯但無資料。
mssql 擴展預設文字欄位長度限制 4096 位元組ntext/nvarchar 使用 Unicode (UCS-2/UTF-16) 儲存,每字元 2-4 位元組,極易超過限制php_mssql.dll 基於 FreeTDS 0.91,對大型 Unicode 欄位支援不完善; 尋找並修改 (移除前面分號)
mssql.textlimit = 2147483647
mssql.textsize = 2147483647
重啟 Apache/IIS 生效。這將文字欄位限制調至最大值 (2GB)。
<?php
// ❌ 錯誤:直接查 ntext/nvarchar 會截斷或空值
// $sql = "SELECT title, content FROM article";
// ✅ 正確:轉換為非 Unicode 型別
$sql = "SELECT
CONVERT(VARCHAR(MAX), title) AS title,
CONVERT(TEXT, content) AS content
FROM article";
$result = mssql_query($sql);
// 正常處理結果...
?>
| 原始型別 | 轉換目標 | 說明 |
|---|---|---|
| nvarchar(n) | VARCHAR(n) | n ≤ 4000 時安全 |
| nvarchar(max) | VARCHAR(MAX) | SQL Server 2005+ |
| ntext | TEXT | 相容舊版 |
| nchar(n) | CHAR(n) | 固定長度 |
<?php
include("adodb/adodb.inc.php");
$conn = NewADOConnection('odbc_mssql');
$conn->Connect("Driver={SQL Server};Server=localhost;Database=mydb;", 'username', 'password');
$rs = $conn->Execute("SELECT title, content FROM article");
while (!$rs->EOF) {
echo $rs->fields['title'] . "
";
echo $rs->fields['content'] . "
";
$rs->MoveNext();
}
?>
ADOdb 內部處理了型別轉換,相容性較好。
mssql 擴展 PHP 7.0+ 已完全移除。微軟官方維護 Microsoft Drivers for PHP for SQL Server (sqlsrv、PDO_SQLSRV),完整支援 ntext/nvarchar(max)、UTF-8、參數綁定、Always Encrypted 等新功能。
php_sqlsrv_74_nts_x64.dll、php_pdo_sqlsrv_74_nts_x64.dll 至 ext/php.ini 加入:extension=php_sqlsrv_74_nts_x64.dll
extension=php_pdo_sqlsrv_74_nts_x64.dll
<?php
$serverName = "localhost";
$connectionInfo = ["Database" => "mydb", "UID" => "user", "PWD" => "pass", "CharacterSet" => "UTF-8"];
$pdo = new PDO("sqlsrv:Server=$serverName;Database=mydb", "user", "pass", [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
]);
$stmt = $pdo->query("SELECT title, content FROM article");
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
echo $row['title'] . "
";
echo $row['content'] . "
";
}
?>
mssql_connect → sqlsrv_connect / PDOmssql_query → sqlsrv_query / PDO::querymssql_fetch_array → sqlsrv_fetch_array / PDO::fetchCONVERT(VARCHAR/TEXT, ...) 變通寫法CharacterSet=UTF-8短期可用 方案二 (SQL CONVERT) 快速修復;長期務必 遷移至 sqlsrv/PDO_SQLSRV,才是穩定、安全、支援現代 SQL Server 功能的正確道路。