TDengine 字符串函数 CHAR 用户手册

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;

注意事项

  1. ASCII 码范围:标准 ASCII 码范围是 0-127,扩展 ASCII 是 0-255,超过 255 的值会产生多字节字符。

  2. NULL 值跳过:输入参数中的 NULL 值会被自动跳过,不影响其他字符的生成。

  3. 不可打印字符:某些 ASCII 值对应的是不可打印字符(如控制字符),虽然会包含在结果中,但可能无法正常显示。

  4. 字符串参数转换:字符串类型的输入会被尝试转换为数值,转换失败可能导致意外结果。

  5. 参数数量限制:虽然理论上支持 2^31 - 1 个参数,但实际使用中应考虑性能和可读性。

  6. 多字节处理:当输入值大于 255 时,会按照高位到低位的顺序生成多个字节。

  7. 性能考虑:在大数据集上频繁使用 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 中的直接体现。它提供了一种程序化的方式来构造字符串,特别是包含特殊字符或不可打印字符的字符串。

实际应用价值

  1. 协议数据生成

    • 生成通信协议帧
    • 构造特殊字符序列
    • 支持设备通信
  2. 数据格式化

    • 日志格式化
    • 报告生成
    • 输出标准化
  3. 编码转换

    • 数字到字符转换
    • 状态码映射
    • 标识符生成
  4. 特殊字符处理

    • 生成分隔符
    • 插入控制字符
    • 构造特殊标记
  5. 动态字符串构建

    • 运行时字符串生成
    • 条件化内容构造
    • 灵活的文本处理

本用户手册提供了 CHAR 函数的完整使用说明,特别针对电力系统中的日志生成、数据编码、协议通信等实际需求,所有示例均符合 TDengine 语法规范,方便用户快速上手并应用于生产环境。

关于 TDengine

TDengine 专为物联网IoT平台、工业大数据平台设计。其中,TDengine TSDB 是一款高性能、分布式的时序数据库(Time Series Database),同时它还带有内建的缓存、流式计算、数据订阅等系统功能;TDengine IDMP 是一款AI原生工业数据管理平台,它通过树状层次结构建立数据目录,对数据进行标准化、情景化,并通过 AI 提供实时分析、可视化、事件管理与报警等功能。

相关推荐
如意猴34 分钟前
【C++】007 C/C++ 内存管理机制、malloc与new的区别及模板初阶
java·c++·算法
可乐鸡翅yeah_44 分钟前
HLS 分片过期清理,直播旧 TS 分片磁盘爆满问题处理
java·后端·spring·m3u8·m3u8在线·音视频在线播放
YCOSA20251 小时前
雨晨 Windows 11 IoT 企业版 Edge 轻装 VCDX 29680.1000
windows·物联网
写后端的胖头鱼1 小时前
【高频面试题】FullText 全文索引(MySQL)
数据库·mysql·索引·全文索引
躺柒1 小时前
读数据架构知识体系指南14数据编织
大数据·数据仓库·数据分析·数据湖·数据编织
专业程序开发源1 小时前
SSM校园拍摄交流服务平台36936-计算机课程设计、毕业设计
java·spring boot·后端·python·elasticsearch·php·课程设计
用户094248568031 小时前
第23章:OpenJDK逃逸分析、标量替换与锁优化
java·jvm
wuminyu1 小时前
LockStack在虚拟线程Mount和Unmount拷贝过程剖析
java·linux·c语言·jvm·c++
路远的数据库笔记1 小时前
SQL Server迁移国产数据库怎么做?九套口岸库零停机割接实战
数据库·经验分享·sqlserver·dba
樱花落木兰1 小时前
分布式登录实战:Session 会话共享改造,Redis 存储用户登录状态
java·javascript·数据库·redis·分布式·缓存