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

SQL Server 獲取 TEXT/NTEXT/IMAGE 大字段長度:DATALENGTH vs LEN 詳細對比

     編輯:關於SqlServer

TEXT/NTEXT/IMAGE (已棄用,新開發用 VARCHAR(MAX)/NVARCHAR(MAX)/VARBINARY(MAX)) 及大值類型無法直接用 LEN(),需使用 DATALENGTH() 獲取**字節數**,或轉換後用 LEN() 獲取**字符數**。

核心函數對比

函數返回值適用類型NULL 處理備註
DATALENGTH(expr)**字節數** (Bytes)所有類型,含大值/二進制返回 NULL不截取尾隨空格
LEN(str_expr)**字符數** (Characters),不含尾隨空格字符串類型 (非 TEXT/NTEXT/IMAGE 直接用)返回 NULL雙字節字符算 1 個字符

實戰範例

CREATE TABLE Demo (
    Id INT IDENTITY PRIMARY KEY,
    TxtCol TEXT,
    NtxtCol NTEXT,
    BinCol IMAGE,
    MaxCol VARCHAR(MAX)
);

INSERT INTO Demo (TxtCol, NtxtCol, BinCol, MaxCol) 
VALUES ('Hello', N'你好', 0x48656C6C6F, 'Hello World');

-- DATALENGTH: 字節數
SELECT 
    DATALENGTH(TxtCol) AS TxtBytes,      -- 5
    DATALENGTH(NtxtCol) AS NtxtBytes,    -- 6 (UTF-16, 3字符×2)
    DATALENGTH(BinCol) AS BinBytes,      -- 5
    DATALENGTH(MaxCol) AS MaxBytes       -- 11
FROM Demo;

-- LEN: 需先轉換 (TEXT/NTEXT/IMAGE 不支援直接 LEN)
SELECT 
    LEN(CAST(TxtCol AS VARCHAR(MAX))) AS TxtChars,      -- 5
    LEN(CAST(NtxtCol AS NVARCHAR(MAX))) AS NtxtChars,   -- 3
    LEN(CAST(MaxCol AS VARCHAR(MAX))) AS MaxChars       -- 11
FROM Demo;

關鍵差異陷阱

  • DATALENGTH('Hello ') = 6 (含尾隨空格);LEN('Hello ') = 5 (忽略尾隨空格)。
  • DATALENGTH(N'中') = 2 字節;LEN(N'中') = 1 字符。
  • VARBINARY 只能用 DATALENGTH,不可用 LEN。

遷移建議:棄用類型 → 大值類型

新類型支援所有字符串函數、索引、變量賦值、參數傳遞,**全面優於舊類型**。

效能提示

  • 大字段長度計算涉及 LOB 頁面讀取,頻繁調用會產生大量 I/O。
  • 若需頻繁查詢長度,建議添加**計算列持久化**:
    ALTER TABLE Demo ADD TxtLen AS DATALENGTH(TxtCol) PERSISTED; 並可建立索引。
  • 避免在 WHERE/JOIN 中對大字段用函數 (WHERE DATALENGTH(Col) > 1000),破壞 SARGability。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
舊類型新類型 (SQL 2005+)長度獲取
TEXTVARCHAR(MAX)DATALENGTH / LEN 直接支援
NTEXTNVARCHAR(MAX)DATALENGTH / LEN 直接支援
IMAGEVARBINARY(MAX)DATALENGTH 直接支援