StarRocks 数据类型全面详解(对比 MySQL)

一、数值类型对比

整型(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 | VARCHARTINYINT | 需修改应用 |

九、性能优化建议

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替代 |

核心建议

  1. 数值 :优先 DECIMALV3 > DECIMAL,避免浮点数
  2. 字符串VARCHAR(已知长度) 或 STRING(未知)
  3. 日期必须用 DATEV2/DATETIMEV2
  4. 复杂数据 :大胆使用 ARRAY/MAP/JSON
  5. 状态码 :用 TINYINTBOOLEAN
相关推荐
岁岁种桃花儿21 小时前
MySQL从入门到精通系列:InnoDB记录存储结构
数据库·mysql
jiunian_cn1 天前
【Redis】hash数据类型相关指令
数据库·redis·哈希算法
冉冰学姐1 天前
SSM在线影评网站平台82ap4(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·ssm框架·在线影评平台·影片分类
知识分享小能手1 天前
SQL Server 2019入门学习教程,从入门到精通,SQL Server 2019数据库的操作(2)
数据库·学习·sqlserver
踩坑小念1 天前
秒杀场景下如何处理redis扣除状态不一致问题
数据库·redis·分布式·缓存·秒杀
萧曵 丶1 天前
MySQL 语句书写顺序与执行顺序对比速记表
数据库·mysql
Wiktok1 天前
MySQL的常用数据类型
数据库·mysql
曹牧1 天前
Oracle 表闪回(Flashback Table)
数据库·oracle
J_liaty1 天前
Redis 超详细入门教程:从零基础到实战精通
数据库·redis·缓存
m0_706653231 天前
用Python批量处理Excel和CSV文件
jvm·数据库·python