TDengine 数学函数 ASCII 用户手册

ASCII 函数
语法
ASCII(expr)
功能说明
返回字符串第一个字符的 ASCII 码值,可以实现快速分类。
版本
v3.3.3.0
返回结果类型
BIGINT
适用数据类型
VARCHAR、NCHAR
嵌套子查询支持
适用于内层查询和外层查询。
适用于
表和超级表。
使用说明
- 如果
expr为 NULL,返回 NULL。 - 如果
expr为空字符串,返回 NULL。 - 如果
expr的第一个字符为多字节字符(如中文),只会返回该字符第一个字节的值对应的 ASCII 码。 - 只能与普通列、TAG 列、选择(Selection)、投影(Projection)函数一起使用,不能与聚合(Aggregation)函数一起使用。
示例所用表与数据(可直接复制执行)
-- 建库与使用
CREATE DATABASE IF NOT EXISTS power;
USE power;-- 智能电表表结构
CREATE STABLE meters (ts TIMESTAMP,current FLOAT,voltage INT,phase FLOAT,power DOUBLE,device_id VARCHAR(64),status_code VARCHAR(32),error_msg VARCHAR(128)
) TAGS (groupid INT,location VARCHAR(64)
);-- 子表
CREATE TABLE d1001 USING meters TAGS (1, 'California.SanFrancisco');
CREATE TABLE d1002 USING meters TAGS (2, 'California.LosAngeles');-- 写入数据
INSERT INTO d1001 VALUES('2024-01-01 00:00:00.000', 10.3, 220, 30.0, 2266.0, 'DEVICE_SF_001', 'NORMAL', ''),('2024-01-01 00:15:00.000', 12.6, 221, 32.0, 2784.6, 'DEVICE_SF_001', 'WARNING', 'High current'),('2024-01-01 00:30:00.000', 11.5, 222, 31.0, 2553.0, 'DEVICE_SF_001', 'ERROR', 'Voltage unstable');INSERT INTO d1002 VALUES('2024-01-01 00:00:00.000', 9.0, 219, 28.0, 1971.0, 'DEVICE_LA_001', 'NORMAL', ''),('2024-01-01 00:15:00.000', 14.5, 218, 40.0, 3161.0, 'DEVICE_LA_001', 'ALERT', 'Overload detected'),('2024-01-01 00:30:00.000', 8.2, 220, 25.0, 1804.0, 'DEVICE_LA_002', 'OK', '');
基础示例
示例 1: 常量字符串
-- 获取单个字符的 ASCII 码
taos> SELECT ASCII('A');ascii('A') |
==================65 |-- 获取小写字母的 ASCII 码
taos> SELECT ASCII('a');ascii('a') |
==================97 |-- 获取数字的 ASCII 码
taos> SELECT ASCII('0');ascii('0') |
==================48 |
示例 2: NULL 和空字符串处理
-- NULL 值
taos> SELECT ASCII(NULL);ascii(null) |
==================NULL |-- 空字符串
taos> SELECT ASCII('');ascii('') |
==================NULL |
示例 3: 多字符字符串
-- 只返回第一个字符的 ASCII 码
taos> SELECT ASCII('Hello');ascii('Hello') |
==================72 |-- 中文字符(返回第一个字节的值)
taos> SELECT ASCII('你好');ascii('你好') |
==================228 |
示例 4: 特殊字符
-- 空格
taos> SELECT ASCII(' ');ascii(' ') |
==================32 |-- 制表符
taos> SELECT ASCII('\t');ascii('\t') |
==================9 |-- 换行符
taos> SELECT ASCII('\n');ascii('\n') |
==================10 |
示例 5: 列数据 ASCII 计算
-- 获取状态码首字符的 ASCII 值
SELECT ts,status_code,ASCII(status_code) AS status_ascii
FROM d1001
ORDER BY ts;
ts | status_code | status_ascii |
==========================================================2024-01-01 00:00:00.000 | NORMAL | 78 |2024-01-01 00:15:00.000 | WARNING | 87 |2024-01-01 00:30:00.000 | ERROR | 69 |
智能电表场景示例
示例 6: 状态码分类
目的:根据状态码首字母的 ASCII 值进行快速分类。
-- 按状态码首字母分类
SELECT status_code,ASCII(status_code) AS ascii_value,CASEWHEN ASCII(status_code) = 78 THEN 'Normal-类'WHEN ASCII(status_code) = 87 THEN 'Warning-类'WHEN ASCII(status_code) = 69 THEN 'Error-类'WHEN ASCII(status_code) = 65 THEN 'Alert-类'WHEN ASCII(status_code) = 79 THEN 'OK-类'ELSE '其他'END AS status_category
FROM meters
GROUP BY status_code
ORDER BY ascii_value;
应用价值:
- 快速状态分类
- 简化状态码处理
- 提高查询效率
示例 7: 设备 ID 排序优化
目的:利用 ASCII 值优化设备 ID 的排序和索引。
-- 按设备 ID 首字符 ASCII 值排序
SELECT device_id,ASCII(device_id) AS id_ascii,COUNT(*) AS record_count
FROM meters
GROUP BY device_id
ORDER BY id_ascii;
应用价值:
- 优化排序性能
- 设备分组管理
- 快速检索
示例 8: 错误消息分析
目的:分析错误消息的字符特征。
-- 分析错误消息首字符
SELECT error_msg,ASCII(error_msg) AS msg_ascii,CASEWHEN ASCII(error_msg) >= 65 AND ASCII(error_msg) <= 90 THEN '大写字母开头'WHEN ASCII(error_msg) >= 97 AND ASCII(error_msg) <= 122 THEN '小写字母开头'WHEN ASCII(error_msg) >= 48 AND ASCII(error_msg) <= 57 THEN '数字开头'ELSE '特殊字符或空'END AS msg_type
FROM meters
WHERE error_msg != ''
ORDER BY ts;
应用价值:
- 错误消息分类
- 快速识别消息类型
- 优化日志处理
示例 9: 字符编码验证
目的:验证字符串是否为纯 ASCII 字符。
-- 检测设备 ID 是否为纯 ASCII
SELECT device_id,ASCII(device_id) AS first_char_ascii,CASEWHEN ASCII(device_id) < 128 THEN 'ASCII字符'ELSE '非ASCII字符'END AS encoding_type
FROM meters
GROUP BY device_id;
应用价值:
- 数据质量检测
- 编码一致性验证
- 系统兼容性检查
示例 10: 状态码统计
目的:基于 ASCII 值快速统计不同状态。
-- 统计不同状态类别的记录数
SELECT CASEWHEN ASCII(status_code) = 78 THEN 'Normal'WHEN ASCII(status_code) = 87 THEN 'Warning'WHEN ASCII(status_code) = 69 THEN 'Error'WHEN ASCII(status_code) = 65 THEN 'Alert'WHEN ASCII(status_code) = 79 THEN 'OK'END AS status_type,COUNT(*) AS count
FROM meters
GROUP BY ASCII(status_code)
ORDER BY count DESC;
应用价值:
- 快速状态统计
- 监控告警分析
- 运行状态报表
示例 11: 设备命名规范检查
目的:检查设备 ID 是否符合命名规范(如必须以大写字母 D 开头)。
-- 检查设备 ID 命名规范
SELECT device_id,ASCII(device_id) AS first_char,CASEWHEN ASCII(device_id) = 68 THEN '符合规范'ELSE '不符合规范'END AS naming_check
FROM meters
GROUP BY device_id;
应用价值:
- 数据规范性检查
- 命名标准验证
- 数据质量保证
示例 12: 快速字符比较
目的:利用 ASCII 值进行快速字符串比较。
-- 找出状态码字母序在 'M' 之后的记录
SELECT ts,status_code,ASCII(status_code) AS ascii_val
FROM meters
WHERE ASCII(status_code) > ASCII('M')
ORDER BY ts
LIMIT 10;
应用价值:
- 加速字符串比较
- 优化查询性能
- 简化条件判断
生产场景应用
场景 A: 日志级别分类系统
目的:构建基于 ASCII 值的高效日志级别分类系统。
应用示例:
-- 按日志级别快速分类
SELECT _wstart AS time_window,CASEWHEN ASCII(status_code) = 78 THEN 'INFO'WHEN ASCII(status_code) = 87 THEN 'WARN'WHEN ASCII(status_code) = 69 THEN 'ERROR'WHEN ASCII(status_code) = 65 THEN 'CRITICAL'END AS log_level,COUNT(*) AS log_count
FROM meters
WHERE ts >= NOW - 24h
INTERVAL(1h)
ORDER BY time_window, log_level;
场景 B: 设备标识验证
目的:验证设备标识符的合法性和一致性。
应用示例:
-- 验证设备 ID 格式
SELECT device_id,ASCII(device_id) AS first_ascii,LENGTH(device_id) AS id_length,CASEWHEN ASCII(device_id) = 68 AND LENGTH(device_id) = 13 THEN '有效'ELSE '无效'END AS validation_status
FROM meters
GROUP BY device_id
HAVING validation_status = '无效';
场景 C: 状态码快速索引
目的:建立基于 ASCII 值的状态码快速索引系统。
应用示例:
-- 生成状态码索引表
SELECT ASCII(status_code) AS status_index,status_code,COUNT(*) AS occurrence,MIN(ts) AS first_seen,MAX(ts) AS last_seen
FROM meters
GROUP BY status_code
ORDER BY status_index;
场景 D: 字符编码兼容性检查
目的:确保系统中所有字符串数据使用一致的字符编码。
应用示例:
-- 检测非标准 ASCII 字符
SELECT device_id,error_msg,ASCII(device_id) AS device_ascii,ASCII(error_msg) AS msg_ascii
FROM meters
WHERE ASCII(device_id) >= 128OR ASCII(error_msg) >= 128
LIMIT 100;
注意事项
-
多字节字符处理:对于多字节字符(如中文),ASCII 函数只返回第一个字节的值,这通常不是期望的结果。
-
空字符串与 NULL:空字符串返回 NULL,需要在使用时注意判断。
-
大小写敏感:大写字母和小写字母的 ASCII 值不同,如 ‘A’(65) 和 ‘a’(97)。
-
ASCII 码范围:标准 ASCII 码范围是 0-127,扩展 ASCII 是 0-255。
-
性能考虑:ASCII 函数计算速度快,适合用于大数据集的字符串处理。
-
字符编码:确保数据库和客户端使用一致的字符编码,避免乱码问题。
数学关系
ASCII 码表(常用字符):
- 数字:‘0’(48) - ‘9’(57)
- 大写字母:‘A’(65) - ‘Z’(90)
- 小写字母:‘a’(97) - ‘z’(122)
- 空格:’ '(32)
- 制表符:‘\t’(9)
- 换行符:‘\n’(10)
- 回车符:‘\r’(13)
特殊关系:
- 大小写字母差值:小写字母 ASCII 值 = 大写字母 ASCII 值 + 32
- 数字字符转数值:数值 = ASCII(字符) - 48
相关函数
- CHAR:将 ASCII 码值转换为字符
- LENGTH:返回字符串长度
- SUBSTR:提取子字符串
- UPPER:转换为大写字母
- LOWER:转换为小写字母
函数意义与价值
数学意义
ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统。ASCII 函数将字符映射到 0-127 的整数值,为字符处理提供了数学基础。
实际应用价值
-
快速字符分类
- 基于首字符快速分类
- 状态码识别
- 数据类型判断
-
字符串排序优化
- 自然排序实现
- 索引优化
- 查询加速
-
数据验证
- 格式验证
- 编码检查
- 规范性校验
-
字符串比较
- 快速比较
- 大小写处理
- 字符范围判断
-
编码转换
- 字符编码识别
- 兼容性检查
- 数据清洗
本用户手册提供了 ASCII 函数的完整使用说明,特别针对电力系统中的状态码管理、设备标识验证、日志分析等实际需求,所有示例均符合 TDengine 语法规范,方便用户快速上手并应用于生产环境。
关于 TDengine
TDengine 是一款专为物联网、工业互联网等场景设计并优化的大数据平台,其核心模块是高性能、集群开源、云原生、极简的时序数据库。
它能安全高效地将大量设备每天产生的高达 TB 甚至 PB 级的数据进行汇聚、存储、分析和分发,并提供 AI 智能体对数据进行预测与异常检测,提供实时的商业洞察。
