TDengine 字符串函数 LENGTH 用户手册

LENGTH 函数使用手册
函数概述
函数名称: LENGTH
函数类型: 字符串标量函数
功能说明: 返回字符串的字节长度。对于变长类型(VARCHAR、NCHAR、VARBINARY)返回实际存储的字节数。
支持版本: TDengine 3.0+
语法格式
LENGTH(expr)
参数说明
| 参数 | 说明 | 数据类型 | 是否必填 |
|---|---|---|---|
expr | 要计算长度的字符串表达式 | VARCHAR、NCHAR、VARBINARY | 是 |
返回值
- 返回类型: BIGINT
- 返回说明:
- 返回字符串的字节长度
- 如果参数为 NULL,返回 NULL
- 对于 NCHAR 类型,返回实际 UTF-8 编码的字节数
与 CHAR_LENGTH 的区别
| 函数 | 计数单位 | 示例 | 结果 |
|---|---|---|---|
| LENGTH | 字节数 | LENGTH('你好') | 6 |
| CHAR_LENGTH | 字符数 | CHAR_LENGTH('你好') | 2 |
使用场景示例
场景一:设备位置信息验证
业务背景: 电表安装时需要记录详细位置信息,系统需要验证位置描述的长度是否符合要求
-- 创建超级表
CREATE STABLE test.meters (`ts` TIMESTAMP, `current` FLOAT, `voltage` INT, `phase` FLOAT
) TAGS (`groupid` INT, `location` VARCHAR(100)
);-- 插入测试数据
INSERT INTO test.d001 USING test.meters TAGS(1, 'Beijing Chaoyang District Jianguomenwai Avenue Building A Room 2001')
VALUES ('2024-01-15 08:00:00', 10.5, 220, 0.85);INSERT INTO test.d002 USING test.meters TAGS(2, '上海市浦东新区陆家嘴金融中心东塔20层')
VALUES ('2024-01-15 08:00:00', 8.3, 218, 0.90);-- 查询:检查位置信息长度是否超过限制
SELECT tbname,location,LENGTH(location) as bytes_len,CHAR_LENGTH(location) as char_len,CASE WHEN LENGTH(location) > 80 THEN '位置描述过长,建议简化'WHEN LENGTH(location) < 10 THEN '位置描述过短,建议补充'ELSE '位置描述合适'END as validation_result
FROM test.meters;
输出示例:
tbname | location | bytes_len | char_len | validation_result
-------|-------------------------------------------------------|-----------|----------|-------------------
d001 | Beijing Chaoyang District Jianguomenwai Avenue... | 66 | 66 | 位置描述合适
d002 | 上海市浦东新区陆家嘴金融中心东塔20层 | 57 | 21 | 位置描述合适
目的:
- 确保位置信息符合数据库字段长度限制
- 避免因长度超限导致数据截断
- 区分字节长度和字符长度,处理中英文混合场景
场景二:数据存储优化分析
业务背景: 分析标签字段的实际存储占用,优化数据库schema设计
-- 统计不同位置信息的存储占用情况
SELECT MIN(LENGTH(location)) as min_bytes,MAX(LENGTH(location)) as max_bytes,AVG(LENGTH(location)) as avg_bytes,COUNT(*) as total_devices,SUM(LENGTH(location)) as total_storage_bytes
FROM test.meters;-- 找出存储占用最大的设备位置
SELECT tbname,location,LENGTH(location) as storage_bytes
FROM test.meters
ORDER BY LENGTH(location) DESC
LIMIT 10;
输出示例:
min_bytes | max_bytes | avg_bytes | total_devices | total_storage_bytes
----------|-----------|-----------|---------------|--------------------
10 | 98 | 45 | 1000 | 45000
目的:
- 评估VARCHAR字段的实际使用情况
- 判断是否可以缩小字段定义以节省存储空间
- 识别异常数据(过长或过短的记录)
场景三:数据质量监控
业务背景: 监控位置信息的数据质量,发现空值、异常短内容等问题
-- 创建数据质量监控视图
SELECT COUNT(*) as total_count,COUNT(CASE WHEN location IS NULL THEN 1 END) as null_count,COUNT(CASE WHEN LENGTH(location) = 0 THEN 1 END) as empty_count,COUNT(CASE WHEN LENGTH(location) < 5 THEN 1 END) as too_short_count,COUNT(CASE WHEN LENGTH(location) > 90 THEN 1 END) as too_long_count,AVG(LENGTH(location)) as avg_length
FROM test.meters;-- 查询数据质量异常的设备
SELECT tbname,groupid,location,LENGTH(location) as len,CASE WHEN location IS NULL THEN '位置信息缺失'WHEN LENGTH(location) = 0 THEN '位置信息为空'WHEN LENGTH(location) < 5 THEN '位置信息过短'WHEN LENGTH(location) > 90 THEN '位置信息过长'END as issue_type
FROM test.meters
WHERE location IS NULL OR LENGTH(location) = 0 OR LENGTH(location) < 5 OR LENGTH(location) > 90;
目的:
- 自动化数据质量检查
- 及时发现数据录入问题
- 为数据清洗提供依据
场景四:字符编码分析
业务背景: 分析位置信息中中英文字符的占比,用于系统国际化评估
-- 分析位置信息的字符特征
SELECT tbname,location,LENGTH(location) as byte_len,CHAR_LENGTH(location) as char_len,ROUND(LENGTH(location) * 1.0 / CHAR_LENGTH(location), 2) as bytes_per_char,CASE WHEN LENGTH(location) = CHAR_LENGTH(location) THEN '纯ASCII字符'WHEN LENGTH(location) > CHAR_LENGTH(location) * 2 THEN '主要为中文'ELSE '中英文混合'END as content_type
FROM test.meters
WHERE location IS NOT NULL;
输出示例:
content_type | device_count | avg_byte_len | avg_char_len
--------------|--------------|--------------|-------------
纯ASCII字符 | 350 | 42.50 | 42.50
主要为中文 | 450 | 48.30 | 17.20
中英文混合 | 200 | 45.80 | 25.60
目的:
- 了解数据的字符组成特征
- 评估存储空间利用率
- 为前端显示宽度设置提供参考
场景五:批量数据迁移验证
业务背景: 在系统升级或数据迁移时,验证VARCHAR字段长度是否会超出新系统限制
-- 模拟:将location字段从VARCHAR(100)迁移到VARCHAR(50)
-- 检查哪些数据会被截断
SELECT tbname,location,LENGTH(location) as current_bytes,CASE WHEN LENGTH(location) <= 50 THEN '可以安全迁移'ELSE CONCAT('需要截断 ', CAST(LENGTH(location) - 50 AS VARCHAR(10)), ' 字节')END as migration_status,SUBSTRING(location, 1, 50) as truncated_value
FROM test.meters
WHERE LENGTH(location) > 50
ORDER BY LENGTH(location) DESC;-- 统计迁移影响范围
SELECT COUNT(*) as total_records,COUNT(CASE WHEN LENGTH(location) <= 50 THEN 1 END) as safe_records,COUNT(CASE WHEN LENGTH(location) > 50 THEN 1 END) as affected_records,ROUND(COUNT(CASE WHEN LENGTH(location) > 50 THEN 1 END) * 100.0 / COUNT(*), 2) as affected_percentage
FROM test.meters;
目的:
- 评估schema变更的影响范围
- 避免数据迁移导致的数据丢失
- 为数据清洗策略提供依据
性能考虑
- 索引友好: LENGTH函数可以用于WHERE子句,如果字段上有索引,查询效率较高
- 计算开销: 对于VARCHAR/NCHAR类型,LENGTH计算开销很小,为O(1)复杂度
- 避免重复计算: 在复杂查询中,建议使用子查询或CTE缓存LENGTH结果
注意事项
- NULL处理: LENGTH(NULL) 返回 NULL
- 空字符串: LENGTH(‘’) 返回 0
- 多字节字符:
- 中文字符在UTF-8编码下通常占3个字节
- 使用CHAR_LENGTH获取字符数而非字节数
- VARBINARY类型: LENGTH可用于VARBINARY,返回二进制数据的字节长度
相关函数
CHAR_LENGTH(): 返回字符数而非字节数SUBSTRING(): 按字节位置截取字符串LTRIM()/RTRIM(): 移除空格后可能改变长度UPPER()/LOWER(): 大小写转换不改变字节长度
示例:综合应用
-- 智能电表位置信息完整性报告
SELECT '位置信息质量报告' as report_name,COUNT(*) as total_devices,COUNT(CASE WHEN location IS NOT NULL AND LENGTH(location) >= 10 THEN 1 END) as valid_locations,COUNT(CASE WHEN location IS NULL OR LENGTH(location) = 0 THEN 1 END) as missing_locations,COUNT(CASE WHEN LENGTH(location) > 0 AND LENGTH(location) < 10 THEN 1 END) as incomplete_locations,ROUND(COUNT(CASE WHEN location IS NOT NULL AND LENGTH(location) >= 10 THEN 1 END) * 100.0 / COUNT(*), 2) as completeness_rate,ROUND(AVG(LENGTH(location)), 2) as avg_location_length,MAX(LENGTH(location)) as max_location_length
FROM test.meters;
关于 TDengine
TDengine 专为物联网IoT平台、工业大数据平台设计。其中,TDengine TSDB 是一款高性能、分布式的时序数据库(Time Series Database),同时它还带有内建的缓存、流式计算、数据订阅等系统功能;TDengine IDMP 是一款AI原生工业数据管理平台,它通过树状层次结构建立数据目录,对数据进行标准化、情景化,并通过 AI 提供实时分析、可视化、事件管理与报警等功能。
