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

PHP 連接 MSSQL 解決 nvarchar 欄位截斷 255 字元問題

     編輯:PHP 綜合知識

問題現象

PHP 透過 mssql 或 sqlsrv 擴展查詢 MSSQL nvarchar(MAX) 或 nvarchar(1000) 欄位時,回傳資料被截斷為 255 字元。原因是舊版驅動程式預設將 nvarchar 視為 varchar(255) 處理。

解決方案:SQL 層面強制轉型

-- 原查詢
SELECT summary FROM article;

-- 修正查詢
SELECT CAST(summary AS NTEXT) FROM article;
-- 或
SELECT CONVERT(NTEXT, summary) FROM article;

適用場景: 無法升級驅動程式、快速修復既有程式碼。

CAST/CONVERT 語法詳解

CAST ( expression AS data_type )
CONVERT ( data_type, expression [, style] )
  • expression:目標欄位或運算式
  • data_type:目標型別,NTEXT (Unicode 長文本) 或 NVARCHAR(MAX) (SQL Server 2005+)
  • style:CONVERT 專用格式化參數 (日期/數值格式)

PHP 程式碼實作

<?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.dllPHP 7.0 移除停用,不可用
php_sqlsrv.dll (Microsoft 官方)持續更新強烈推薦,支援 NVARCHAR(MAX)、參數化查詢、PHP 7/8
PDO_SQLSRV持續更新PDO 介面,跨資料庫可移植
FreeTDS + pdo_dblib社群維護Linux 環境替代方案

sqlsrv 驅動安裝要點

  1. 下載對應 PHP 版本/執行緒安全性 (TS/NTS) 的 .dll
  2. 放入 ext 目錄,php.ini 加入 extension=php_sqlsrv_74_ts.dll
  3. 安裝 Microsoft ODBC Driver for SQL Server (版本 17/18)
  4. 重啟 Web 伺服器 / PHP-FPM

最佳實踐總結

  1. 新專案直接使用 sqlsrv 或 PDO_SQLSRV
  2. 既有專案若無法升級,查詢層統一加 CAST(... AS NTEXT)
  3. 避免使用 SELECT *,明確列出欄位並對長文本欄位轉型
  4. 參數化查詢防注入:sqlsrv_query($conn, "SELECT CAST(col AS NTEXT) FROM t WHERE id=?", [$id])
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved