DATALENGTH 函數深度解析:變長資料類型儲存大小的精準測量
DATALENGTH 回傳任意運算式實際佔用的 位元組數,而非字元數。這對變長類型 (varchar, varbinary, nvarchar, text, image 等) 極具價值,是計算儲存成本、驗證資料完整性、優化欄位長度的關鍵工具。
語法與回傳值
DATALENGTH ( expression )
-- 回傳類型: int
-- NULL 輸入回傳 NULL
核心應用場景
| 場景 | 說明 | 範例 |
| 計算實際儲存大小 | varchar/nvarchar 實際位元組數,含雙位元組字元 | DATALENGTH(N'中文') = 6 (UTF-16) |
| 驗證二進位資料完整性 | varbinary/image 檔案大小檢查 | WHERE DATALENGTH(Photo) > 1048576 -- 超過 1MB |
| 欄位長度優化分析 | 統計最大/平均位元組數,決定 varchar(n) 最佳 n | SELECT MAX(DATALENGTH(Email)) FROM Users |
| 比較 CHAR vs VARCHAR 空間 | CHAR 固定長度,DATALENGTH 總 = 定義長度 | CHAR(10) 存 'abc' → DATALENGTH = 10 |
實戰範例:出版社名稱長度分析
USE pubs;
GO
SELECT
DATALENGTH(pub_name) AS ByteLength,
pub_name
FROM publishers
ORDER BY pub_name;
GO
輸出結果
ByteLength pub_name
----------- ----------------------------------------
20 Algodata Infosystems
16 Binnet & Hardley
21 Five Lakes Publishing
5 GGG&G
18 Lucerne Publishing
14 New Moon Books
17 Ramona Publishers
14 Scootney Books
關鍵差異:DATALENGTH vs LEN
| 函數 | 單位 | 尾端空白 | 適用類型 |
| DATALENGTH | 位元組 | 包含 | 所有類型 (含二進位) |
| LEN | 字元 | 不包含 | 字串類型 (非 text/ntext/image) |
版本與相容性注意
- 相容等級 (
sp_dbcmptlevel) 可能影響某邊緣行為
- SQL Server 2019+ 建議搭配
DATALENGTH + COL_LENGTH 做結構描述分析
最佳實務建議
- 儲存空間評估:定期跑
SELECT SUM(DATALENGTH(大欄位)) FROM 大表 監控增長趨勢
- 資料清洗:找出異常長度資料
WHERE DATALENGTH(欄位) > 預期上限
- 避免誤用:切勿用於字元計數,中文環境務必改用
LEN 或 CHARINDEX 邏輯