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 提供实时分析、可视化、事件管理与报警等功能。

相关推荐
q***44816 分钟前
Java进阶10 IO流
java·开发语言
Wang's Blog10 分钟前
MongoDB小课堂: 游标操作与文档投影技术深度解析
数据库·mongodb
济宁雪人12 分钟前
Java安全基础——文件系统安全
java·开发语言·安全
学术小白人12 分钟前
会议第一轮投稿!2026年物联网、数据科学与先进计算国际学术会议(IDSAC2026)
人工智能·物联网·数据分析·能源·制造·教育·rdlink研发家
q***420513 分钟前
使用Django Rest Framework构建API
数据库·django·sqlite
20岁30年经验的码农16 分钟前
Java RabbitMQ 实战指南
java·开发语言·python
非著名架构师22 分钟前
极端天气下的供应链韧性:制造企业如何构建气象风险防御体系
大数据·人工智能·算法·制造·疾风气象大模型·风光功率预测
共享家952731 分钟前
QT-界面优化(下)
开发语言·数据库·qt
maray40 分钟前
Chroma 的设计哲学
数据库·人工智能
gadiaola1 小时前
【计算机网络面试篇】HTTP
java·后端·网络协议·计算机网络·http·面试