TDengine 字符串函数 TO_BASE64 用户手册

TO_BASE64 函数

函数定义

sql 复制代码
TO_BASE64(expr)

功能说明

一句话描述: 将字符串转换为 Base64 编码格式,返回编码后的字符串。

返回字符串 expr 的 Base64 编码结果。Base64 是一种用 64 个可打印 ASCII 字符来表示任意二进制数据的编码方法,常用于数据传输和存储场景。

参数说明

参数 说明 类型 必填
expr 待编码的字符串 VARCHAR、NCHAR

返回值

  • 类型: VARCHAR
  • 编码规则: 使用标准 Base64 字符集(A-Z, a-z, 0-9, +, /)和填充字符(=)
  • 长度: 约为原字符串的 4/3 倍(向上取整到 4 的倍数)
  • NULL 处理: 如果输入为 NULL,返回 NULL

适用范围

  • 数据类型: VARCHAR、NCHAR
  • 适用于: 表和超级表
  • 子查询: 支持内层和外层查询
  • 版本: v3.3.0.0+

基础示例

sql 复制代码
-- 基本用法
taos> SELECT TO_BASE64('Hello');
 to_base64('Hello') |
=====================
 SGVsbG8=           |

-- 编码中文字符
taos> SELECT TO_BASE64('你好');
 to_base64('你好') |
====================
 5L2g5aW9          |

-- 空字符串
taos> SELECT TO_BASE64('');
 to_base64('') |
================
               |

-- NULL 值处理
taos> SELECT TO_BASE64(NULL);
 to_base64(NULL) |
==================
 NULL            |

-- 编码包含特殊字符的字符串
taos> SELECT TO_BASE64('user@example.com');
 to_base64('user@example.com') |
================================
 dXNlckBleGFtcGxlLmNvbQ==      |

使用场景示例

场景 1: 设备位置信息编码传输

业务需求: 将设备位置信息进行 Base64 编码,便于通过 HTTP API 或消息队列传输

sql 复制代码
-- 创建智能电表超级表
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-Building-A-Floor-10')
VALUES ('2024-01-15 08:00:00', 10.5, 220, 0.85);

INSERT INTO test.d002 USING test.meters TAGS(2, 'Shanghai-Pudong-Tower-B-Floor-20')
VALUES ('2024-01-15 08:00:00', 12.3, 221, 0.88);

INSERT INTO test.d003 USING test.meters TAGS(3, 'Guangzhou-Tianhe-Plaza-C-Floor-15')
VALUES ('2024-01-15 08:00:00', 9.8, 219, 0.82);

-- 对位置信息进行 Base64 编码
SELECT 
    tbname,
    location AS original_location,
    TO_BASE64(location) AS encoded_location,
    LENGTH(location) AS original_length,
    LENGTH(TO_BASE64(location)) AS encoded_length
FROM test.meters;

输出示例:

复制代码
tbname | original_location                    | encoded_location                              | original_length | encoded_length
-------|--------------------------------------|-----------------------------------------------|-----------------|----------------
d001   | Beijing-Chaoyang-Building-A-Floor-10| QmVpamluZy1DaGFveWFuZy1CdWlsZGluZy1BLUZsb29yLTEw | 36              | 52
d002   | Shanghai-Pudong-Tower-B-Floor-20    | U2hhbmdoYWktUHVkb25nLVRvd2VyLUItRmxvb3ItMjA=     | 32              | 48
d003   | Guangzhou-Tianhe-Plaza-C-Floor-15   | R3Vhbmd6aG91LVRpYW5oZS1QbGF6YS1DLUZsb29yLTE1     | 33              | 48

目的:

  • 确保位置信息在 URL 参数或 JSON 中安全传输
  • 避免特殊字符(如中文、空格)引起的编码问题
  • 统一数据格式便于跨系统交互

场景 2: 设备配置信息脱敏存储

业务需求: 对设备的敏感配置信息进行简单编码后存储

sql 复制代码
-- 假设增加设备配置标签
ALTER STABLE test.meters ADD TAG device_config VARCHAR(200);

-- 插入包含配置信息的数据
INSERT INTO test.d004 USING test.meters 
TAGS(4, 'Beijing-test', 'ip=192.168.1.100;port=8080;key=secret123')
VALUES ('2024-01-15 08:00:00', 11.0, 222, 0.88);

INSERT INTO test.d005 USING test.meters 
TAGS(5, 'Shanghai-test', 'ip=192.168.1.101;port=8080;key=secret456')
VALUES ('2024-01-15 08:00:00', 10.2, 219, 0.86);

-- 查询时对配置信息进行编码
SELECT 
    tbname,
    device_config AS original_config,
    TO_BASE64(device_config) AS encoded_config
FROM test.meters
WHERE device_config IS NOT NULL;

输出示例:

复制代码
tbname | original_config                          | encoded_config
-------|------------------------------------------|------------------------------------------------
d004   | ip=192.168.1.100;port=8080;key=secret123| aXA9MTkyLjE2OC4xLjEwMDtwb3J0PTgwODA7a2V5PXNlY3JldDEyMw==
d005   | ip=192.168.1.101;port=8080;key=secret456| aXA9MTkyLjE2OC4xLjEwMTtwb3J0PTgwODA7a2V5PXNlY3JldDQ1Ng==

目的:

  • 对配置信息进行简单混淆,避免明文存储
  • 便于日志查看时不直接暴露敏感信息
  • 注意:Base64 不是加密,仅用于编码,敏感数据应使用专业加密方案

场景 3: 告警消息编码传输

业务需求: 将告警消息编码后通过 HTTP Webhook 发送

sql 复制代码
-- 假设增加告警消息标签
ALTER STABLE test.meters ADD TAG alert_message NCHAR(200);

-- 插入告警数据
INSERT INTO test.d006 USING test.meters 
TAGS(6, 'Beijing-test', '', '电压异常:当前电压240V超过安全阈值220V')
VALUES ('2024-01-15 08:00:00', 10.5, 240, 0.75);

-- 生成编码后的告警消息用于 API 传输
SELECT 
    tbname,
    alert_message,
    TO_BASE64(alert_message) AS encoded_alert,
    CONCAT('https://api.example.com/alert?msg=', TO_BASE64(alert_message)) AS webhook_url
FROM test.meters
WHERE alert_message IS NOT NULL AND alert_message != '';

输出示例:

复制代码
tbname | alert_message                              | encoded_alert                                      | webhook_url
-------|--------------------------------------------|----------------------------------------------------|------------------------------------------
d006   | 电压异常:当前电压240V超过安全阈值220V      | 55S15Y6L5byC5bi477yaW...                           | https://api.example.com/alert?msg=55S15Y6L...

目的:

  • 避免 URL 中的中文和特殊字符引起传输错误
  • 确保告警消息完整传递到第三方系统
  • 支持自动化告警推送

场景 4: 设备标识符编码用于外部系统

业务需求: 将设备标识符编码后用于外部系统集成

sql 复制代码
-- 生成设备的外部标识符
SELECT 
    tbname,
    location,
    TO_BASE64(CONCAT(tbname, '-', location)) AS external_device_id,
    voltage,
    current
FROM test.meters
ORDER BY tbname;

输出示例:

复制代码
tbname | location                             | external_device_id                          | voltage | current
-------|--------------------------------------|---------------------------------------------|---------|--------
d001   | Beijing-Chaoyang-Building-A-Floor-10| ZDAwMS1CZWlqaW5nLUNoYW95YW5nLUJ1aWxkaW5nLUEtRmxvb3ItMTA= | 220 | 10.5
d002   | Shanghai-Pudong-Tower-B-Floor-20    | ZDAwMi1TaGFuZ2hhaS1QdWRvbmctVG93ZXItQi1GbG9vci0yMA== | 221 | 12.3

目的:

  • 生成统一格式的设备标识符
  • 隐藏内部表名和位置信息结构
  • 便于与第三方系统对接

场景 5: 数据导出与批量传输

业务需求: 导出设备数据时对关键字段进行编码

sql 复制代码
-- 导出设备数据,对位置和配置信息编码
SELECT 
    TO_BASE64(tbname) AS device_id,
    ts,
    voltage,
    current,
    TO_BASE64(location) AS encoded_location,
    ROUND(phase, 2) AS phase
FROM test.meters
WHERE ts >= '2024-01-15 00:00:00'
  AND ts < '2024-01-16 00:00:00'
ORDER BY ts;

输出示例:

复制代码
device_id  | ts                      | voltage | current | encoded_location                              | phase
-----------|-------------------------|---------|---------|-----------------------------------------------|------
ZDAwMQ==   | 2024-01-15 08:00:00.000 | 220     | 10.5    | QmVpamluZy1DaGFveWFuZy1CdWlsZGluZy1BLUZsb29yLTEw | 0.85
ZDAwMg==   | 2024-01-15 08:00:00.000 | 221     | 12.3    | U2hhbmdoYWktUHVkb25nLVRvd2VyLUItRmxvb3ItMjA=     | 0.88

目的:

  • 保护数据导出时的敏感信息
  • 统一数据格式便于批量处理
  • 支持跨平台数据交换

编码原理说明

Base64 编码规则

  1. 字符集: 使用 64 个可打印 ASCII 字符(A-Z, a-z, 0-9, +, /)
  2. 编码过程 :
    • 将输入数据每 3 个字节(24位)分为一组
    • 每组 24 位拆分为 4 个 6 位单元
    • 每个 6 位单元对应一个 Base64 字符
  3. 填充 : 如果最后不足 3 字节,用 = 填充

长度计算

复制代码
编码后长度 = ⌈原始字节数 / 3⌉ × 4

例如:

  • "Hello" (5 字节) → 编码后 8 字符
  • "你好" (6 字节 UTF-8) → 编码后 8 字符

性能考虑

  1. 编码开销: Base64 编码会增加约 33% 的数据量
  2. CPU 消耗: 编码过程需要字符转换,大量数据时注意性能
  3. 存储空间: 编码后的字符串占用更多存储空间
  4. 查询优化: 对编码后的字段建立索引意义不大

注意事项

  1. 非加密: Base64 是编码而非加密,不提供安全保护
  2. 可逆性: 任何人都可以轻松解码 Base64 字符串
  3. 安全建议: 敏感数据应使用 AES 等加密算法
  4. 字符集: 输入字符串应为有效的 UTF-8 编码
  5. NULL 处理: 输入 NULL 返回 NULL
  6. 空字符串: 编码空字符串返回空字符串

与其他函数对比

函数 功能 用途 可逆性
TO_BASE64 Base64 编码 数据传输、URL 安全 是(需解码函数)
UPPER 转大写 格式标准化 信息丢失
LOWER 转小写 格式标准化 信息丢失
REPLACE 字符替换 数据清洗 部分可逆
CONCAT 字符串连接 数据组合

相关函数

  • LENGTH(): 获取字符串长度
  • CONCAT(): 字符串连接
  • SUBSTRING(): 提取子串
  • REPLACE(): 字符串替换
  • TRIM(): 去除空格

关于 TDengine

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

相关推荐
安科瑞小许5 分钟前
迈向零碳未来:智慧微电网如何重塑产业园区能源生态
物联网·双碳·碳排放·零碳园区
面向Google编程32 分钟前
Flink源码阅读:Netty通信
大数据·flink
Mr_Xuhhh33 分钟前
博客标题:深入理解Shell:从进程控制到自主实现一个微型Shell
linux·运维·服务器
Tao____35 分钟前
基于Ruoyi开发的IOT物联网平台
java·网络·物联网·mqtt·网络协议
九河云1 小时前
从“被动适配”到“主动重构”:企业数字化转型的底层逻辑
大数据·人工智能·安全·重构·数字化转型
培培说证3 小时前
2026 中专大数据技术专业考证书门槛低的有哪些?
大数据
用户2018792831673 小时前
📚 Android Settings系统:图书馆管理员的故事
android
青莲8433 小时前
Android 事件分发机制 - 事件流向详解
android·前端·面试
小北方城市网3 小时前
第1课:架构设计核心认知|从0建立架构思维(架构系列入门课)
大数据·网络·数据结构·python·架构·数据库架构
收获不止数据库4 小时前
黄仁勋2026CES演讲复盘:旧世界,裂开了!
大数据·数据库·人工智能·职场和发展