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。
遷移建議:棄用類型 → 大值類型
| 舊類型 | 新類型 (SQL 2005+) | 長度獲取 |
| TEXT | VARCHAR(MAX) | DATALENGTH / LEN 直接支援 |
| NTEXT | NVARCHAR(MAX) | DATALENGTH / LEN 直接支援 |
| IMAGE | VARBINARY(MAX) | DATALENGTH 直接支援 |
新類型支援所有字符串函數、索引、變量賦值、參數傳遞,**全面優於舊類型**。
效能提示
- 大字段長度計算涉及 LOB 頁面讀取,頻繁調用會產生大量 I/O。
- 若需頻繁查詢長度,建議添加**計算列持久化**:
ALTER TABLE Demo ADD TxtLen AS DATALENGTH(TxtCol) PERSISTED; 並可建立索引。
- 避免在 WHERE/JOIN 中對大字段用函數 (
WHERE DATALENGTH(Col) > 1000),破壞 SARGability。
- 上一篇文章: SQL Server 進階查詢:子查詢分類與表連接(交叉/內/外連接)完整指南
- 下一篇文章: SQL 字符串字面量中單引號、雙引號的轉義與拼接規則全攻略
Copyright ©
程式碼之家 All Rights Reserved