首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 8060 位元組列大小限制:成因、影響與解決方案

     編輯:關於SqlServer

在 Microsoft SQL Server 中,單一資料列的最大允許大小為 8,060 位元組。資料列不可跨資料頁儲存,而一個資料頁為 8 KB(8,192 位元組),扣除頁首與內部結構開銷後,實際可用空間即為 8,060 位元組。

觸發警告的典型案例

CREATE TABLE [dbo].[TestTable] (
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [content1] [nvarchar](4000) NULL,
    [content2] [nvarchar](4000) NULL
);

執行上述建表語句會收到警告:

Warning: The table 'TestTable' has been created but its maximum row size (16029) exceeds the maximum number of bytes per row (8060). INSERT or UPDATE of a row in this table will fail if the resulting row length exceeds 8060 bytes.

雖然建表成功,但實際 INSERT/UPDATE 導致資料列超過 8,060 位元組時會報錯失敗。

為什麼會超過限制?

  • nvarchar(4000) 最大儲存 4,000 個 Unicode 字元,佔 8,000 位元組。
  • 兩個這類欄位加上 int (4 位元組) 與行首開銷,理論最大長度約 16,029 位元組,遠超 8,060 限制。

解決方案

方案一:拆分資料表(正規化)

將大型文字欄位移至獨立表,透過主鍵關聯:

CREATE TABLE MainTable (
    ID INT PRIMARY KEY,
    -- 其他常用欄位
);

CREATE TABLE LargeContent (
    ID INT PRIMARY KEY REFERENCES MainTable(ID),
    Content1 NVARCHAR(MAX),
    Content2 NVARCHAR(MAX)
);

方案二:使用大數值資料類型(建議)

SQL Server 2005 起支援 NVARCHAR(MAX)、VARCHAR(MAX)、VARBINARY(MAX),最大 2 GB,資料超過 8,000 位元組時自動移至 LOB (Large Object) 儲存,行內僅保留 16 位元組指標,繞過 8,060 限制。

CREATE TABLE TestTable (
    ID INT IDENTITY(1,1) PRIMARY KEY,
    Content1 NVARCHAR(MAX),
    Content2 NVARCHAR(MAX)
);

方案三:舊版本使用 TEXT/NTEXT/IMAGE(不建議新專案)

SQL Server 2000 可用 TEXT、NTEXT、IMAGE 類型,行內佔 16 位元組指標。但這些類型已棄用,功能受限(如無法直接用 = 比較,需用 TEXTPTR、READTEXT),新開發請改用 MAX 類型。

最佳實務建議

  • 設計表時評估單列最大可能長度,避免超過 8,060 位元組。
  • 優先使用 NVARCHAR(MAX)/VARCHAR(MAX) 處理大型文字。
  • 若必須在舊版本處理大資料,考慮檔案資料流或外部儲存(如檔案伺服器、Blob 儲存)僅存路徑於資料庫。
  • 使用 sp_help '表名' 或管理工具檢視實際資料列大小統計。

理解 8,060 位元組限制的成因與現代解決方案,能在資料庫設計階段避免上線後的資料寫入失敗風險。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved