一、数值类型对比
整型(Integer)
|---------|------------|---------------------|---------------------|----|----------------------|
| 类型 | StarRocks | MySQL | 范围 | 字节 | 说明 |
| 微小整型 | TINYINT | TINYINT | -128 ~ 127 | 1 | 有符号 |
| 无符号微小整型 | ❌ 不支持 | TINYINT UNSIGNED | 0 ~ 255 | 1 | StarRocks 无 UNSIGNED |
| 小整型 | SMALLINT | SMALLINT | -32768 ~ 32767 | 2 | |
| 无符号小整型 | ❌ 不支持 | SMALLINT UNSIGNED | 0 ~ 65535 | 2 | |
| 中等整型 | INT | MEDIUMINT | -8388608 ~ 8388607 | 3 | StarRocks 叫 INT |
| 整型 | INT | INT | -2³¹ ~ 2³¹-1 | 4 | 常用 |
| 无符号整型 | ❌ 不支持 | INT UNSIGNED | 0 ~ 2³²-1 | 4 | |
| 大整型 | BIGINT | BIGINT | -2⁶³ ~ 2⁶³-1 | 8 | |
| 无符号大整型 | ❌ 不支持 | BIGINT UNSIGNED | 0 ~ 2⁶⁴-1 | 8 | |
| 超大整型 | LARGEINT | ❌ 不支持 | -2¹²⁷ ~ 2¹²⁷-1 | 16 | StarRocks 特有 |
示例对比
-- StarRocks 整型
CREATE TABLE int_types (
id INT, -- 整型
age TINYINT, -- 年龄
count SMALLINT, -- 数量
views BIGINT, -- 浏览量(大数)
balance LARGEINT -- 余额(极大数)
);
-- MySQL 整型(支持无符号)
CREATE TABLE int_types (
id INT UNSIGNED, -- 无符号
age TINYINT UNSIGNED,
count SMALLINT,
views BIGINT UNSIGNED
);
浮点型(Floating)
|-------------|-------------|-----------|--------|----|------------------|
| 类型 | StarRocks | MySQL | 精度 | 字节 | 说明 |
| 单精度浮点 | FLOAT | FLOAT | 约7位小数 | 4 | 近似值 |
| 双精度浮点 | DOUBLE | DOUBLE | 约15位小数 | 8 | 近似值 |
| 定点数 | DECIMAL | DECIMAL | 精确小数 | 可变 | 推荐 |
| StarRocks扩展 | DECIMALV3 | ❌ 不支持 | 更高精度 | 可变 | StarRocks 特有 |
DECIMAL 类型对比
-- StarRocks DECIMAL
CREATE TABLE decimal_types (
-- DECIMAL(P, S) P=总位数, S=小数位
price DECIMAL(10, 2), -- 共10位,2位小数
rate DECIMAL(5, 4), -- 共5位,4位小数
big_num DECIMAL(38, 10), -- 最大38位
-- DECIMALV3(StarRocks特有,更高性能)
precise_price DECIMALV3(20, 8)
);
-- MySQL DECIMAL
CREATE TABLE decimal_types (
price DECIMAL(10, 2),
rate DECIMAL(5, 4)
-- MySQL最大65位
);
二、字符串类型对比
字符串类型详细对比
|----------|--------------|--------------|----------|-----|----|
| 类型 | StarRocks | MySQL | 最大长度 | 存储 | 说明 |
| 定长字符串 | CHAR(n) | CHAR(n) | 255字符 | 固定 | |
| 变长字符串 | VARCHAR(n) | VARCHAR(n) | 65533字符 | 可变 | 推荐 |
| MySQL长文本 | ❌ 不支持 | TINYTEXT | 255字节 | 可变 | |
| 短文本 | STRING | TEXT | 2GB | 可变 | |
| 中等文本 | ❌ 不支持 | MEDIUMTEXT | 16MB | 可变 | |
| 长文本 | ❌ 不支持 | LONGTEXT | 4GB | 可变 | |
| 变长二进制 | VARBINARY | VARBINARY | 同VARCHAR | 二进制 | |
| JSON类型 | JSON | JSON | 无限制 | 可变 | |
字符串示例
-- StarRocks 字符串
CREATE TABLE string_types (
name VARCHAR(50), -- 变长字符串
code CHAR(10), -- 定长字符串(如国家代码)
description STRING, -- 长文本
json_data JSON, -- JSON数据
binary_data VARBINARY(100) -- 二进制数据
);
-- MySQL 字符串
CREATE TABLE string_types (
name VARCHAR(50),
code CHAR(10),
short_text TINYTEXT, -- StarRocks不支持
long_text LONGTEXT, -- StarRocks不支持
description TEXT
);
重要区别:STRING vs VARCHAR
-- StarRocks中:
-- VARCHAR(65533):最大65533字符,要求定义长度
-- STRING:可变长,最大2GB,无需定义长度
-- 推荐使用:
title VARCHAR(255), -- 已知长度时用VARCHAR
content STRING, -- 不确定长度时用STRING
url VARCHAR(2083), -- URL最大长度
email VARCHAR(320) -- 邮箱最大长度
三、日期时间类型对比
日期时间类型详细对比
|-------------|--------------|-------------|---------------------|--------------------------------------------|----------------------|
| 类型 | StarRocks | MySQL | 格式 | 范围 | 说明 |
| 日期 | DATE | DATE | YYYY-MM-DD | 1000-01-01 ~ 9999-12-31 | |
| 日期时间 | DATETIME | DATETIME | YYYY-MM-DD HH:MM:SS | 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 | |
| 时间戳 | ❌ 不支持 | TIMESTAMP | YYYY-MM-DD HH:MM:SS | 1970-01-01 ~ 2038-01-19 | StarRocks用DATETIME替代 |
| 年份 | ❌ 不支持 | YEAR | YYYY | 1901 ~ 2155 | |
| StarRocks特有 | DATEV2 | ❌ 不支持 | 更高效 | 0000-01-01 ~ 9999-12-31 | 性能更好 |
| StarRocks特有 | DATETIMEV2 | ❌ 不支持 | 带微秒 | 0000-01-01 ~ 9999-12-31 | 推荐使用 |
日期时间示例
-- StarRocks 日期时间(推荐V2版本)
CREATE TABLE datetime_types (
-- 基础类型
birth_date DATE, -- 生日
create_time DATETIME, -- 创建时间
-- ★ 推荐:V2版本(性能更好)
event_date DATEV2, -- 事件日期
update_time DATETIMEV2(3), -- 更新时间(3位微秒)
-- DATETIMEV2(p) p=微秒精度(0-6)
-- 时间运算
duration BIGINT -- 时长(秒数)
);
-- MySQL 日期时间
CREATE TABLE datetime_types (
birth_date DATE,
create_time DATETIME,
update_time TIMESTAMP, -- 自动更新
year_field YEAR, -- 年份
time_field TIME -- 时间
);
日期函数差异
-- StarRocks(部分函数不同)
SELECT
NOW(), -- 当前时间
CURRENT_DATE(), -- 当前日期
FROM_UNIXTIME(1672502400), -- 时间戳转日期
UNIX_TIMESTAMP('2023-01-01'), -- 日期转时间戳
DATE_TRUNC('month', create_time), -- 截断到月初
DATE_ADD(create_time, INTERVAL 1 DAY) -- 日期加减
-- MySQL(函数更丰富)
SELECT
NOW(),
CURDATE(),
UNIX_TIMESTAMP(),
FROM_UNIXTIME(),
DATE_FORMAT(create_time, '%Y-%m'),
TIMESTAMPDIFF(DAY, start, end)
四、布尔和枚举类型
布尔类型对比
-- StarRocks
CREATE TABLE bool_types (
is_active BOOLEAN, -- 布尔值
-- 实际存储为TINYINT: 0=false, 1=true, NULL=NULL
status TINYINT DEFAULT 1 -- 也可用TINYINT模拟
);
-- MySQL
CREATE TABLE bool_types (
is_active BOOLEAN, -- 同TINYINT(1)
status BOOL -- BOOL是BOOLEAN的别名
);
枚举类型对比
-- ❌ StarRocks 不支持 ENUM
-- CREATE TABLE test (status ENUM('A','B','C')); -- 错误!
-- ✅ 替代方案
CREATE TABLE enum_alternative (
status VARCHAR(10), -- 用字符串代替
status_code TINYINT -- 用整型代码代替
);
-- MySQL 支持 ENUM
CREATE TABLE test (
status ENUM('active', 'inactive', 'deleted')
);
五、复杂类型(StarRocks特有)
1. ARRAY 数组类型
-- ★ StarRocks 特有
CREATE TABLE array_types (
id INT,
tags ARRAY<VARCHAR(20)>, -- 字符串数组
scores ARRAY<INT>, -- 整数数组
prices ARRAY<DECIMAL(10,2)>, -- 小数数组
-- 多维数组
matrix ARRAY<ARRAY<INT>> -- 二维数组
);
-- 插入数据
INSERT INTO array_types VALUES
(1, ['美食', '旅游', '电影'], [95, 88, 92]);
-- 查询
SELECT
tags[1] as first_tag, -- 访问元素
size(tags) as tag_count, -- 数组长度
array_sum(scores) as total_score -- 数组求和
FROM array_types;
2. MAP 映射类型
-- ★ StarRocks 特有
CREATE TABLE map_types (
id INT,
properties MAP<VARCHAR(100), VARCHAR(200)>, -- Map<键类型,值类型>
config MAP<VARCHAR(50), INT>,
nested MAP<VARCHAR(20), ARRAY<INT>> -- 嵌套类型
);
-- 插入数据
INSERT INTO map_types VALUES
(1, {'color': 'red', 'size': 'XL'}, {'retry': 3, 'timeout': 30});
-- 查询
SELECT
properties['color'] as color, -- 获取值
map_keys(properties) as keys, -- 所有键
map_values(config) as values -- 所有值
FROM map_types;
3. STRUCT 结构体类型
-- ★ StarRocks 特有
CREATE TABLE struct_types (
id INT,
user_info STRUCT< -- 定义结构体
name: VARCHAR(50),
age: INT,
email: VARCHAR(100)
>,
address STRUCT<
city: VARCHAR(20),
street: VARCHAR(100),
zip: VARCHAR(10)
>
);
-- 查询
SELECT
user_info.name, -- 访问字段
user_info.age,
address.city
FROM struct_types;
六、特殊和过时类型
不推荐使用的类型
|--------|--------------------|--------------------|----|-------------------|
| 类型 | StarRocks | MySQL | 状态 | 替代方案 |
| HLL | HLL | ❌ 不支持 | 保留 | 使用 HLL_UNION 函数 |
| BITMAP | BITMAP | BITMAP | 专用 | 去重统计 |
| 浮点 | DOUBLE PRECISION | DOUBLE PRECISION | 别名 | 用 DOUBLE |
类型别名对比
-- StarRocks 别名
BOOL -- BOOLEAN的别名
DOUBLE PRECISION -- DOUBLE的别名
DEC -- DECIMAL的别名
NUMERIC -- DECIMAL的别名
FIXED -- DECIMAL的别名
-- MySQL 别名
BOOL -- TINYINT(1)
INTEGER -- INT
DEC -- DECIMAL
NUMERIC -- DECIMAL
REAL -- DOUBLE
七、类型选择建议
1. 数值类型选择指南
选择顺序:
金额/精确计算 → DECIMAL(P,S) (P≤38)
→ DECIMALV3(P,S) (性能更好)
超大整数 → LARGEINT
大整数 → BIGINT (9e18以内)
普通整数 → INT (21亿以内)
小范围整数 → SMALLINT (3万以内)
布尔/状态码 → TINYINT 或 BOOLEAN
浮点数 → 避免使用,用DECIMAL替代
2. 字符串类型选择
选择顺序:
已知固定长度 → CHAR(n) (n≤255)
已知最大长度 → VARCHAR(n) (n≤65533)
未知或很长 → STRING
JSON数据 → JSON
二进制数据 → VARBINARY
3. 日期时间类型选择
★ 强烈推荐:
所有DATE → DATEV2
所有DATETIME → DATETIMEV2(3) (3位微秒精度)
4. 示例:电商表设计
CREATE TABLE ecommerce_orders (
-- 标识类
order_id BIGINT, -- 订单ID(大整数)
user_id INT, -- 用户ID
-- 金额类(精确计算)
amount DECIMAL(10, 2), -- 订单金额
discount DECIMAL(5, 4), -- 折扣率
-- 字符串类
order_no VARCHAR(32), -- 订单号
user_name VARCHAR(50), -- 用户名
address STRING, -- 地址(可能很长)
tags ARRAY<VARCHAR(20)>, -- 标签数组
-- 日期时间类(★用V2版本)
order_date DATEV2, -- 订单日期
create_time DATETIMEV2(3), -- 创建时间(毫秒级)
pay_time DATETIMEV2(3), -- 支付时间
-- 状态类
status TINYINT, -- 状态码 0-9
is_paid BOOLEAN, -- 是否支付
properties MAP<VARCHAR(50), STRING> -- 扩展属性
-- 统计类
view_count BIGINT, -- 浏览次数
favorite_count LARGEINT -- 收藏次数(可能很大)
)
DUPLICATE KEY(order_id)
DISTRIBUTED BY HASH(order_id) BUCKETS 10
PROPERTIES ("replication_num" = "1");
八、类型转换和兼容性
1. 隐式类型转换规则
-- StarRocks支持一些隐式转换
SELECT 1 + '2'; -- 字符串转数字 → 3
SELECT '2023-01-01' + INTERVAL 1 DAY; -- 字符串转日期
-- 但比MySQL严格
-- MySQL: SELECT 'abc' = 0; → 1 (true)
-- StarRocks: SELECT 'abc' = 0; → 报错或false
2. 显式类型转换函数
-- 通用转换
CAST(expr AS type)
CONVERT(expr, type)
-- 示例
SELECT
CAST('123' AS INT),
CAST(123.45 AS DECIMAL(5,2)),
CAST('2023-01-01' AS DATE),
CAST('[1,2,3]' AS ARRAY<INT>)
3. 与MySQL的类型映射
|--------------------|-----------------------|--------|
| MySQL 类型 | StarRocks 对应类型 | 注意事项 |
| TINYINT UNSIGNED | SMALLINT | 范围映射 |
| MEDIUMINT | INT | |
| TIMESTAMP | DATETIME | 时区处理不同 |
| YEAR | SMALLINT | |
| TINYTEXT/TEXT | STRING | |
| ENUM | VARCHAR 或 TINYINT | 需修改应用 |
九、性能优化建议
1. 类型选择性能影响
-- 好的选择(性能高)
id INT, -- 4字节
status TINYINT, -- 1字节
price DECIMAL(10,2), -- 精确计算
create_time DATEV2, -- V2版本更快
-- 坏的选择(性能低)
id STRING, -- 变长,慢
status VARCHAR(10), -- 字符串比TINYINT慢
price DOUBLE, -- 浮点不精确
create_time DATETIME -- 旧版本慢
2. 存储空间优化
-- 查看表存储信息
SHOW DATA FROM table_name;
-- 查看列统计信息
SHOW COLUMN STATS table_name;
-- 优化建议
-- 1. 使用最小合适的类型
-- 2. 对低基数列使用字典压缩
-- 3. 日期时间用V2版本
-- 4. 避免使用NULL(用默认值替代)
十、总结对比表
|----------|----------------------|--------------|-----------------------------|
| 类别 | StarRocks 优势 | MySQL 优势 | 建议 |
| 整数 | 有LARGEINT超大整型 | 支持UNSIGNED | StarRocks选型更简单 |
| 小数 | DECIMALV3性能更好 | DECIMAL最大65位 | 都用DECIMAL |
| 字符串 | STRING类型灵活 | 有TEXT家族 | StarRocks用STRING替代TEXT |
| 日期 | DATEV2/DATETIMEV2更快 | 有YEAR/TIME | StarRocks用V2版本 |
| 布尔 | 简单BOOLEAN | 同 | 相同 |
| 复杂类型 | ✅ 支持ARRAY/MAP/STRUCT | ❌ 不支持 | StarRocks优势明显 |
| 枚举 | ❌ 不支持 | ✅ 支持 | StarRocks用VARCHAR/TINYINT替代 |
核心建议:
- 数值 :优先
DECIMALV3>DECIMAL,避免浮点数 - 字符串 :
VARCHAR(已知长度) 或STRING(未知) - 日期 :必须用
DATEV2/DATETIMEV2 - 复杂数据 :大胆使用
ARRAY/MAP/JSON - 状态码 :用
TINYINT或BOOLEAN