
CHAR 函数
语法
sql
CHAR(expr1 [, expr2] [, expr3] ...)
功能说明
将输入参数当作整数,并返回这些整数在 ASCII 编码中对应的字符组成的字符串。
版本
v3.3.3.0
返回结果类型
VARCHAR
适用数据类型
整数类型、VARCHAR、NCHAR
嵌套子查询支持
适用于内层查询和外层查询。
适用于
表和超级表。
使用说明
- 输入的值超过 255 会被转化成多字节的结果,如
CHAR(256)等同于CHAR(1,0)、CHAR(256 * 256)等同于CHAR(1,0,0)。 - 输入参数的 NULL 值会被跳过。
- 输入参数若为字符串类型,会将其转换为数值类型处理。
- 若输入的参数对应的字符为不可打印字符,返回值中仍有该参数对应的字符,但是可能无法显示出来。
- 输入参数的个数上限为 2^31 - 1 个。
- 只能与普通列、TAG 列、选择(Selection)、投影(Projection)函数一起使用,不能与聚合(Aggregation)函数一起使用。
示例所用表与数据(可直接复制执行)
sql
-- 建库与使用
CREATE DATABASE IF NOT EXISTS power;
USE power;
-- 智能电表表结构
CREATE STABLE meters (
ts TIMESTAMP,
current FLOAT,
voltage INT,
phase FLOAT,
power DOUBLE,
status_code INT,
error_code INT,
device_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, 78, 0, 'Normal'),
('2024-01-01 00:15:00.000', 12.6, 221, 32.0, 2784.6, 87, 1, 'Warning'),
('2024-01-01 00:30:00.000', 11.5, 222, 31.0, 2553.0, 69, 2, 'Error');
INSERT INTO d1002 VALUES
('2024-01-01 00:00:00.000', 9.0, 219, 28.0, 1971.0, 79, 0, 'OK'),
('2024-01-01 00:15:00.000', 14.5, 218, 40.0, 3161.0, 65, 3, 'Alert'),
('2024-01-01 00:30:00.000', 8.2, 220, 25.0, 1804.0, 78, 0, 'Normal');
基础示例
示例 1: 单个字符转换
sql
-- 转换单个 ASCII 码为字符
taos> SELECT CHAR(77);
char(77) |
===========
M |
-- 转换小写字母
taos> SELECT CHAR(97);
char(97) |
===========
a |
-- 转换数字字符
taos> SELECT CHAR(48);
char(48) |
===========
0 |
示例 2: 多个字符组合
sql
-- 组合多个字符
taos> SELECT CHAR(72, 101, 108, 108, 111);
char(72, 101, 108, 108, 111) |
===============================
Hello |
-- 组合形成单词
taos> SELECT CHAR(84, 68, 101, 110, 103, 105, 110, 101);
char(84, 68, 101, 110, 103, 105, 110, 101) |
=============================================
TDengine |
示例 3: NULL 值处理
sql
-- NULL 值会被跳过
taos> SELECT CHAR(77, NULL, 77);
char(77, null, 77) |
=====================
MM |
-- 多个 NULL 值
taos> SELECT CHAR(65, NULL, NULL, 66);
char(65, null, null, 66) |
===========================
AB |
示例 4: 超过 255 的值
sql
-- 256 等同于 CHAR(1, 0)
taos> SELECT CHAR(256);
char(256) |
======================
|
-- 多字节组合
taos> SELECT CHAR(77 * 256 + 77);
char(77 * 256 + 77) |
======================
MM |
-- 65536 等同于 CHAR(1, 0, 0)
taos> SELECT CHAR(65536);
char(65536) |
======================
|
示例 5: 特殊字符
sql
-- 制表符
taos> SELECT CHAR(9);
char(9) |
==========
|
-- 换行符
taos> SELECT CHAR(10);
char(10) |
===========
|
-- 空格
taos> SELECT CHAR(32);
char(32) |
===========
|
智能电表场景示例
示例 6: 状态码转换为字符
目的:将数字状态码转换为对应的首字母标识。
sql
-- 将状态码转换为字母
SELECT ts,
status_code,
CHAR(status_code) AS status_char
FROM d1001
ORDER BY ts;
ts | status_code | status_char |
==========================================================
2024-01-01 00:00:00.000 | 78 | N |
2024-01-01 00:15:00.000 | 87 | W |
2024-01-01 00:30:00.000 | 69 | E |
应用价值:
- 快速生成状态标识
- 简化显示格式
- 便于图表展示
示例 7: 错误代码解析
目的:将错误代码转换为可读的字符标识。
sql
-- 组合多个字段生成错误标识
SELECT ts,
error_code,
CHAR(69, error_code + 48) AS error_label
FROM meters
WHERE error_code > 0
ORDER BY ts;
应用价值:
- 错误码可视化
- 快速识别错误类型
- 简化日志分析
示例 8: 设备消息编码
目的:根据状态码生成标准化的设备消息前缀。
sql
-- 生成消息前缀
SELECT CHAR(91) AS prefix_start,
CHAR(status_code) AS status_char,
CHAR(93) AS prefix_end,
device_msg
FROM meters
ORDER BY ts
LIMIT 5;
应用价值:
- 标准化消息格式
- 统一编码规范
- 便于系统集成
示例 9: ASCII 码范围验证
目的:验证状态码是否在可打印字符范围内。
sql
-- 检查状态码是否为可打印字符
SELECT status_code,
CHAR(status_code) AS status_char,
CASE
WHEN status_code >= 32 AND status_code <= 126 THEN '可打印'
WHEN status_code >= 65 AND status_code <= 90 THEN '大写字母'
WHEN status_code >= 97 AND status_code <= 122 THEN '小写字母'
ELSE '不可打印'
END AS char_type
FROM meters
GROUP BY status_code
ORDER BY status_code;
应用价值:
- 数据质量检查
- 编码规范验证
- 异常数据识别
示例 10: 生成分隔符
目的:使用 CHAR 函数生成特殊分隔符。
sql
-- 生成带分隔符的状态报告
SELECT CONCAT(
CHAR(status_code),
CHAR(58), -- 冒号
CHAR(32), -- 空格
device_msg
) AS status_report
FROM meters
WHERE ts >= '2024-01-01 00:00:00'
ORDER BY ts
LIMIT 5;
应用价值:
- 格式化输出
- 生成标准报告
- 提高可读性
示例 11: 多字节字符生成
目的:使用多个 ASCII 值组合生成特定标识。
sql
-- 生成设备标识前缀
SELECT CHAR(68, 69, 86) AS device_prefix,
status_code,
device_msg
FROM meters
WHERE error_code = 0
ORDER BY ts;
应用价值:
- 生成统一标识
- 设备分类管理
- 简化命名规则
示例 12: 字符串构建
目的:通过 CHAR 函数动态构建字符串。
sql
-- 构建状态消息
SELECT ts,
CONCAT(
CHAR(91), -- [
CHAR(status_code), -- 状态字符
CHAR(93), -- ]
CHAR(32), -- 空格
device_msg
) AS formatted_msg
FROM meters
ORDER BY ts
LIMIT 5;
应用价值:
- 动态消息生成
- 格式化日志
- 统一输出标准
生产场景应用
场景 A: 日志格式化系统
目的:构建标准化的日志格式输出系统。
应用示例:
sql
-- 生成格式化日志
SELECT ts,
CONCAT(
CHAR(91), -- [
CHAR(status_code), -- 状态标识
CHAR(93), -- ]
CHAR(32), -- 空格
CHAR(69, 82, 82, 58, 32), -- ERR:
CAST(error_code AS VARCHAR),
CHAR(32, 45, 32), -- 空格-空格
device_msg
) AS log_entry
FROM meters
WHERE error_code > 0
ORDER BY ts;
场景 B: 数据编码转换
目的:将数字编码转换为字符编码,便于系统间数据交换。
应用示例:
sql
-- 生成字符编码
SELECT location,
status_code,
CHAR(status_code) AS status_encoded,
COUNT(*) AS record_count
FROM meters
GROUP BY location, status_code
ORDER BY location, status_code;
场景 C: 协议数据生成
目的:生成符合特定通信协议的数据帧。
应用示例:
sql
-- 生成协议帧
SELECT CONCAT(
CHAR(2), -- STX (Start of Text)
CAST(status_code AS VARCHAR),
CHAR(44), -- 逗号
CAST(error_code AS VARCHAR),
CHAR(3) -- ETX (End of Text)
) AS protocol_frame
FROM meters
WHERE ts >= '2024-01-01 00:00:00'
ORDER BY ts
LIMIT 10;
场景 D: 可视化标签生成
目的:为数据可视化系统生成简洁的状态标签。
应用示例:
sql
-- 生成可视化标签
SELECT _wstart AS time_window,
location,
CHAR(AVG(status_code)) AS avg_status_label,
COUNT(*) AS sample_count
FROM meters
WHERE ts >= NOW - 24h
INTERVAL(1h)
ORDER BY location, time_window;
注意事项
-
ASCII 码范围:标准 ASCII 码范围是 0-127,扩展 ASCII 是 0-255,超过 255 的值会产生多字节字符。
-
NULL 值跳过:输入参数中的 NULL 值会被自动跳过,不影响其他字符的生成。
-
不可打印字符:某些 ASCII 值对应的是不可打印字符(如控制字符),虽然会包含在结果中,但可能无法正常显示。
-
字符串参数转换:字符串类型的输入会被尝试转换为数值,转换失败可能导致意外结果。
-
参数数量限制:虽然理论上支持 2^31 - 1 个参数,但实际使用中应考虑性能和可读性。
-
多字节处理:当输入值大于 255 时,会按照高位到低位的顺序生成多个字节。
-
性能考虑:在大数据集上频繁使用 CHAR 函数生成复杂字符串时,需要注意性能开销。
数学关系
ASCII 码表(常用范围):
- 控制字符:0-31
- 空格:32
- 数字:'0'(48) - '9'(57)
- 大写字母:'A'(65) - 'Z'(90)
- 小写字母:'a'(97) - 'z'(122)
- 扩展 ASCII:128-255
多字节转换规则:
CHAR(n)其中 n > 255:CHAR(256)=CHAR(1, 0)CHAR(257)=CHAR(1, 1)CHAR(n)=CHAR(n / 256, n % 256)
字符组合:
- 多个参数会按顺序组合成字符串
- NULL 参数被忽略
- 结果长度等于非 NULL 参数个数(单字节字符情况下)
相关函数
- ASCII:返回字符串第一个字符的 ASCII 码(CHAR 的逆函数)
- CONCAT:字符串连接函数,常与 CHAR 配合使用
- CAST:类型转换函数,用于将数值转为字符串
- ORD:返回字符的数值编码(如果支持)
函数意义与价值
数学意义
CHAR 函数实现了从数值到字符的映射,是 ASCII 编码系统在 SQL 中的直接体现。它提供了一种程序化的方式来构造字符串,特别是包含特殊字符或不可打印字符的字符串。
实际应用价值
-
协议数据生成
- 生成通信协议帧
- 构造特殊字符序列
- 支持设备通信
-
数据格式化
- 日志格式化
- 报告生成
- 输出标准化
-
编码转换
- 数字到字符转换
- 状态码映射
- 标识符生成
-
特殊字符处理
- 生成分隔符
- 插入控制字符
- 构造特殊标记
-
动态字符串构建
- 运行时字符串生成
- 条件化内容构造
- 灵活的文本处理
本用户手册提供了 CHAR 函数的完整使用说明,特别针对电力系统中的日志生成、数据编码、协议通信等实际需求,所有示例均符合 TDengine 语法规范,方便用户快速上手并应用于生产环境。
关于 TDengine
TDengine 专为物联网IoT平台、工业大数据平台设计。其中,TDengine TSDB 是一款高性能、分布式的时序数据库(Time Series Database),同时它还带有内建的缓存、流式计算、数据订阅等系统功能;TDengine IDMP 是一款AI原生工业数据管理平台,它通过树状层次结构建立数据目录,对数据进行标准化、情景化,并通过 AI 提供实时分析、可视化、事件管理与报警等功能。