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

相关推荐
加勒比之杰克1 小时前
【操作系统原理】Linux 进程控制
linux·运维·服务器·进程控制
啊吧怪不啊吧1 小时前
算法王冠上的明珠——动态规划之斐波那契数列问题
大数据·算法·动态规划
spencer_tseng2 小时前
Eclipse Oxygen 4.7.2 ADT(android developer tools) Plugin
android·java·eclipse
来来走走3 小时前
Android开发(Kotlin) 协程
android·java·kotlin
河铃旅鹿4 小时前
Android开发-java版:Framgent
android·java·笔记·学习
wanhengidc8 小时前
云手机的软件核心是什么
运维·服务器·web安全·游戏·智能手机
2501_916008898 小时前
手机抓包app大全:无需root的安卓抓包软件列表
android·ios·智能手机·小程序·uni-app·iphone·webview
百锦再9 小时前
第18章 高级特征
android·java·开发语言·后端·python·rust·django
芬加达9 小时前
jvm八股
运维·服务器·jvm