上一篇
场景引入:
某天,同事小王急匆匆跑来求助:“大佬!客户要求统计所有产品描述的字符长度,但数据库里存的都是TEXT
类型,我用LEN()
函数怎么算都不对😵💫…” 这时候,作为SQL老司机的你微微一笑:“别急,TEXT字段要用特殊姿势处理!”
在SQL Server中:
VARCHAR/CHAR
➜ 用LEN()
或DATALENGTH()
轻松搞定 TEXT/NTEXT
➜ 是LOB(大对象)类型,常规函数直接罢工 ❌ -- 错误示范(返回NULL或报错) SELECT LEN(description) FROM Products WHERE id = 1;
临时转成VARCHAR(MAX)
再计算:
SELECT LEN(CAST(description AS VARCHAR(MAX))) AS char_count, DATALENGTH(CAST(description AS VARCHAR(MAX))) AS byte_count FROM Products
👍 优点:简单直观,兼容性好
👎 缺点:超大文本(>8000字符)需注意性能
适合超长文本场景:
DECLARE @ptr VARBINARY(16) SELECT @ptr = TEXTPTR(description) FROM Products WHERE id = 1 -- 获取字节长度 SELECT DATALENGTH(@ptr) AS text_length
💡 冷知识:这个方法其实是调用了SQL Server的底层指针机制
应对极端老旧版本:
DECLARE @total_len INT = 0 DECLARE @chunk VARCHAR(8000) DECLARE @pos INT = 1 WHILE @pos <= DATALENGTH(description) BEGIN SET @chunk = SUBSTRING(description, @pos, 8000) SET @total_len = @total_len + LEN(@chunk) SET @pos = @pos + 8000 END SELECT @total_len AS total_char_count
如果可能,直接修改表结构:
ALTER TABLE Products ALTER COLUMN description NVARCHAR(MAX)
🎯 优势:
编码陷阱:
DATALENGTH()
=字符数 NULL处理:
记得加ISNULL
防止空值报错:
SELECT LEN(ISNULL(CAST(description AS VARCHAR(MAX)), ''))
性能警示:
百万级数据量避免全表扫描,建议加WHERE
条件过滤
方法 | 10万条耗时 | 适用场景 |
---|---|---|
CAST转VARCHAR(MAX) | 2秒 | 通用推荐 |
TEXTPTR | 8秒 | 超长文本(>1MB) |
分段计算 | 5秒 | SQL Server 2000 |
DATALENGTH()/2
近似计算中英文混合文本长度 LEN(STRING_AGG())
组合技能处理拼接后文本 NVARCHAR(MAX)
才是王道! 本文由 汝嘉言 于2025-08-05发表在【云服务器提供商】,文中图片由(汝嘉言)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/545527.html
发表评论