
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 编码规则
- 字符集: 使用 64 个可打印 ASCII 字符(A-Z, a-z, 0-9, +, /)
- 编码过程 :
- 将输入数据每 3 个字节(24位)分为一组
- 每组 24 位拆分为 4 个 6 位单元
- 每个 6 位单元对应一个 Base64 字符
- 填充 : 如果最后不足 3 字节,用
=填充
长度计算
编码后长度 = ⌈原始字节数 / 3⌉ × 4
例如:
- "Hello" (5 字节) → 编码后 8 字符
- "你好" (6 字节 UTF-8) → 编码后 8 字符
性能考虑
- 编码开销: Base64 编码会增加约 33% 的数据量
- CPU 消耗: 编码过程需要字符转换,大量数据时注意性能
- 存储空间: 编码后的字符串占用更多存储空间
- 查询优化: 对编码后的字段建立索引意义不大
注意事项
- 非加密: Base64 是编码而非加密,不提供安全保护
- 可逆性: 任何人都可以轻松解码 Base64 字符串
- 安全建议: 敏感数据应使用 AES 等加密算法
- 字符集: 输入字符串应为有效的 UTF-8 编码
- NULL 处理: 输入 NULL 返回 NULL
- 空字符串: 编码空字符串返回空字符串
与其他函数对比
| 函数 | 功能 | 用途 | 可逆性 |
|---|---|---|---|
| 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 提供实时分析、可视化、事件管理与报警等功能。