BINARY/VARBINARY
BINARY(M)
VARBINARY(M)
自 v3.0 起,StarRocks 支持 BINARY/VARBINARY 数据类型,用于存储二进制数据。支持的最大长度与 VARCHAR [1, 1048576] 相同。单位:字节。如果未指定 M
,则默认使用 1048576。二进制数据类型包含字节字符串,而字符数据类型包含字符字符串。
BINARY 是 VARBINARY 的别名。用法与 VARBINARY 相同。
限制和使用注意事项
-
重复键、主键和唯一键表支持 VARBINARY 列。聚合表不支持 VARBINARY 列。
-
VARBINARY 列不能用作分区键、分桶键或重复键、主键和唯一键表的维度列。它们不能用于 ORDER BY、GROUP BY 和 JOIN 子句中。
-
在长度未对齐的情况下,BINARY(M)/VARBINARY(M) 不会进行右填充。
示例
创建 VARBINARY 类型的列
创建表时,使用关键字 VARBINARY
将列 j
指定为 VARBINARY 列。
CREATE TABLE `test_binary` (
`id` INT(11) NOT NULL COMMENT "",
`j` VARBINARY NULL COMMENT ""
) ENGINE=OLAP
DUPLICATE KEY(`id`)
COMMENT "OLAP"
DISTRIBUTED BY HASH(`id`)
PROPERTIES (
"replication_num" = "3",
"storage_format" = "DEFAULT"
);
mysql> DESC test_binary;
+-------+-----------+------+-------+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-----------+------+-------+---------+-------+
| id | int | NO | true | NULL | |
| j | varbinary | YES | false | NULL | |
+-------+-----------+------+-------+---------+-------+
2 rows in set (0.01 sec)
加载数据并将其存储为 BINARY 类型
StarRocks 支持以下方式加载数据并将其存储为 BINARY 类型。
-
方法 1:使用 INSERT INTO 将数据写入 BINARY 类型的常量列(例如列
j
),其中常量列以x''
为前缀。INSERT INTO test_binary (id, j) VALUES (1, x'abab');
INSERT INTO test_binary (id, j) VALUES (2, x'baba');
INSERT INTO test_binary (id, j) VALUES (3, x'010102');
INSERT INTO test_binary (id, j) VALUES (4, x'0000'); -
方法 2:使用 to_binary 函数将 VARCHAR 数据转换为二进制数据。
INSERT INTO test_binary select 5, to_binary('abab', 'hex');
INSERT INTO test_binary select 6, to_binary('abab', 'base64');
INSERT INTO test_binary select 7, to_binary('abab', 'utf8'); -
方法 3:使用 Broker Load 加载 Parquet 或 ORC 文件,并将文件存储为 BINARY 数据。有关更多信息,请参见 Broker Load。
- 对于 Parquet 文件,直接将
parquet::Type::type::BYTE_ARRAY
转换为TYPE_VARBINARY
。 - 对于 ORC 文件,直接将
orc::BINARY
转换为TYPE_VARBINARY
。
- 对于 Parquet 文件,直接将
-
方法 4:使用 Stream Load 加载 CSV 文件并将文件存储为
BINARY
数据。有关更多信息,请参见 加载 CSV 数据。- CSV 文件使用十六进制格式表示二进制数据。请确保输入的二进制值是有效的十六进制值。
BINARY
类型仅在 CSV 文件中受支持。JSON 文件不支持BINARY
类型。
例如,
t1
是一个包含 VARBINARY 列b
的表。CREATE TABLE `t1` (
`k` int(11) NOT NULL COMMENT "",
`v` int(11) NOT NULL COMMENT "",
`b` varbinary
) ENGINE = OLAP
DUPLICATE KEY(`k`)
PARTITION BY RANGE(`v`) (
PARTITION p1 VALUES [("-2147483648"), ("0")),
PARTITION p2 VALUES [("0"), ("10")),
PARTITION p3 VALUES [("10"), ("20")))
DISTRIBUTED BY HASH(`k`)
PROPERTIES ("replication_num" = "1");
-- csv file
-- cat temp_data
0,0,ab
-- Load CSV file using Stream Load.
curl --location-trusted -u <username>:<password> -T temp_data -XPUT -H column_separator:, -H label:xx http://172.17.0.1:8131/api/test_mv/t1/_stream_load
-- Query the loaded data.
mysql> select * from t1;
+------+------+------------+
| k | v | xx |
+------+------+------------+
| 0 | 0 | 0xAB |
+------+------+------------+
1 rows in set (0.11 sec)
查询和处理 BINARY 数据
StarRocks 支持查询和处理 BINARY 数据,并支持使用 BINARY 函数和运算符。此示例使用表 test_binary
。
注意:如果从 MySQL 客户端访问 StarRocks 时添加了 --binary-as-hex
选项,则二进制数据将使用十六进制表示法显示。
mysql> select * from test_binary;
+------+------------+
| id | j |
+------+------------+
| 1 | 0xABAB |
| 2 | 0xBABA |
| 3 | 0x010102 |
| 4 | 0x0000 |
| 5 | 0xABAB |
| 6 | 0xABAB |
| 7 | 0x61626162 |
+------+------------+
7 rows in set (0.08 sec)
示例 1:使用 hex 函数查看二进制数据。
mysql> select id, hex(j) from test_binary;
+------+----------+
| id | hex(j) |
+------+----------+
| 1 | ABAB |
| 2 | BABA |
| 3 | 010102 |
| 4 | 0000 |
| 5 | ABAB |
| 6 | ABAB |
| 7 | 61626162 |
+------+----------+
7 rows in set (0.02 sec)
示例 2:使用 to_base64 函数查看二进制数据。
mysql> select id, to_base64(j) from test_binary;
+------+--------------+
| id | to_base64(j) |
+------+--------------+
| 1 | q6s= |
| 2 | uro= |
| 3 | AQEC |
| 4 | AAA= |
| 5 | q6s= |
| 6 | q6s= |
| 7 | YWJhYg== |
+------+--------------+
7 rows in set (0.01 sec)
示例 3:使用 from_binary 函数查看二进制数据。
mysql> select id, from_binary(j, 'hex') from test_binary;
+------+-----------------------+
| id | from_binary(j, 'hex') |
+------+-----------------------+
| 1 | ABAB |
| 2 | BABA |
| 3 | 010102 |
| 4 | 0000 |
| 5 | ABAB |
| 6 | ABAB |
| 7 | 61626162 |
+------+-----------------------+
7 rows in set (0.01 sec)