在 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)
);
SQL Server 2000 可用 TEXT、NTEXT、IMAGE 類型,行內佔 16 位元組指標。但這些類型已棄用,功能受限(如無法直接用 = 比較,需用 TEXTPTR、READTEXT),新開發請改用 MAX 類型。
NVARCHAR(MAX)/VARCHAR(MAX) 處理大型文字。sp_help '表名' 或管理工具檢視實際資料列大小統計。理解 8,060 位元組限制的成因與現代解決方案,能在資料庫設計階段避免上線後的資料寫入失敗風險。