PHP 透過 mssql 或 sqlsrv 擴展查詢 MSSQL nvarchar(MAX) 或 nvarchar(1000) 欄位時,回傳資料被截斷為 255 字元。原因是舊版驅動程式預設將 nvarchar 視為 varchar(255) 處理。
-- 原查詢
SELECT summary FROM article;
-- 修正查詢
SELECT CAST(summary AS NTEXT) FROM article;
-- 或
SELECT CONVERT(NTEXT, summary) FROM article;
適用場景: 無法升級驅動程式、快速修復既有程式碼。
CAST ( expression AS data_type )
CONVERT ( data_type, expression [, style] )
expression:目標欄位或運算式data_type:目標型別,NTEXT (Unicode 長文本) 或 NVARCHAR(MAX) (SQL Server 2005+)style:CONVERT 專用格式化參數 (日期/數值格式)<?php
// 使用 sqlsrv 驅動 (推薦)
$serverName = "localhost";
$connInfo = ["Database" => "mydb", "UID" => "user", "PWD" => "pass"];
$conn = sqlsrv_connect($serverName, $connInfo);
$sql = "SELECT id, CAST(content AS NTEXT) AS content FROM articles WHERE id = ?";
$stmt = sqlsrv_query($conn, $sql, [123]);
if ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
echo $row['content']; // 完整內容,不截斷
}
sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);
?>
| 驅動程式 | 狀態 | 建議 |
|---|---|---|
| php_mssql.dll | PHP 7.0 移除 | 停用,不可用 |
| php_sqlsrv.dll (Microsoft 官方) | 持續更新 | 強烈推薦,支援 NVARCHAR(MAX)、參數化查詢、PHP 7/8 |
| PDO_SQLSRV | 持續更新 | PDO 介面,跨資料庫可移植 |
| FreeTDS + pdo_dblib | 社群維護 | Linux 環境替代方案 |
.dllext 目錄,php.ini 加入 extension=php_sqlsrv_74_ts.dllsqlsrv 或 PDO_SQLSRVCAST(... AS NTEXT)SELECT *,明確列出欄位並對長文本欄位轉型sqlsrv_query($conn, "SELECT CAST(col AS NTEXT) FROM t WHERE id=?", [$id])