ScyllaDB数据类型 #

一、数据类型概述 #

1.1 类型分类 #

text
ScyllaDB数据类型
├── 基本类型
│   ├── 数值类型
│   ├── 文本类型
│   ├── 时间类型
│   └── 其他类型
├── 集合类型
│   ├── List
│   ├── Set
│   └── Map
├── 用户定义类型
│   └── UDT
└── 特殊类型
    ├── Counter
    ├── Tuple
    └── Frozen

二、数值类型 #

2.1 整数类型 #

类型 范围 存储大小 示例
tinyint -128 ~ 127 1字节 127
smallint -32768 ~ 32767 2字节 32767
int -2^31 ~ 2^31-1 4字节 2147483647
bigint -2^63 ~ 2^63-1 8字节 9223372036854775807
varint 任意精度 可变 12345678901234567890
sql
-- 创建表
CREATE TABLE numbers (
    id INT PRIMARY KEY,
    tiny_val TINYINT,
    small_val SMALLINT,
    int_val INT,
    big_val BIGINT,
    var_val VARINT
);

-- 插入数据
INSERT INTO numbers (id, tiny_val, small_val, int_val, big_val, var_val)
VALUES (1, 127, 32767, 2147483647, 9223372036854775807, 123456789012345678901234567890);

2.2 浮点类型 #

类型 精度 存储大小 示例
float 6-7位有效数字 4字节 3.14159
double 15-16位有效数字 8字节 3.14159265358979
decimal 任意精度 可变 3.14159265358979323846
sql
-- 创建表
CREATE TABLE floats (
    id INT PRIMARY KEY,
    float_val FLOAT,
    double_val DOUBLE,
    decimal_val DECIMAL
);

-- 插入数据
INSERT INTO floats (id, float_val, double_val, decimal_val)
VALUES (1, 3.14159, 3.14159265358979, 3.141592653589793238462643383279);

三、文本类型 #

3.1 字符串类型 #

类型 描述 示例
ascii ASCII字符串 ‘Hello’
text UTF-8字符串 ‘你好世界’
varchar UTF-8字符串(同text) ‘你好世界’
sql
-- 创建表
CREATE TABLE texts (
    id INT PRIMARY KEY,
    ascii_text ASCII,
    utf8_text TEXT,
    varchar_text VARCHAR
);

-- 插入数据
INSERT INTO texts (id, ascii_text, utf8_text, varchar_text)
VALUES (1, 'Hello', '你好世界', 'こんにちは');

-- 注意:ascii类型只能存储ASCII字符
-- 以下会报错:
-- INSERT INTO texts (id, ascii_text) VALUES (2, '你好');

四、时间类型 #

4.1 时间类型详解 #

类型 格式 示例
timestamp 日期+时间 ‘2024-01-15 10:30:00’
date 日期 ‘2024-01-15’
time 时间 ‘10:30:00.123’
duration 时间段 1y2mo3d4h5m6s7ms8us9ns
sql
-- 创建表
CREATE TABLE events (
    id INT PRIMARY KEY,
    event_time TIMESTAMP,
    event_date DATE,
    event_duration TIME,
    duration_val DURATION
);

-- 插入数据
INSERT INTO events (id, event_time, event_date, event_duration, duration_val)
VALUES (
    1, 
    '2024-01-15 10:30:00', 
    '2024-01-15', 
    '10:30:00.123',
    1y2mo3d
);

-- 使用时间函数
INSERT INTO events (id, event_time, event_date)
VALUES (2, toTimestamp(now()), toDate(now()));

4.2 时间戳操作 #

sql
-- 创建带时间戳的表
CREATE TABLE time_series (
    sensor_id INT,
    reading_time TIMESTAMP,
    value DOUBLE,
    PRIMARY KEY (sensor_id, reading_time)
) WITH CLUSTERING ORDER BY (reading_time DESC);

-- 插入时间戳数据
INSERT INTO time_series (sensor_id, reading_time, value)
VALUES (1, '2024-01-15 10:00:00', 25.5);

INSERT INTO time_series (sensor_id, reading_time, value)
VALUES (1, '2024-01-15 10:01:00', 25.7);

-- 查询时间范围
SELECT * FROM time_series
WHERE sensor_id = 1 
  AND reading_time >= '2024-01-15 10:00:00'
  AND reading_time < '2024-01-15 11:00:00';

五、UUID类型 #

5.1 UUID类型 #

类型 描述 生成方式
uuid 随机UUID uuid()
timeuuid 时间排序UUID now()
sql
-- 创建表
CREATE TABLE uuid_example (
    id UUID PRIMARY KEY,
    time_id TIMEUUID,
    name TEXT
);

-- 插入UUID
INSERT INTO uuid_example (id, time_id, name)
VALUES (uuid(), now(), '张三');

-- 查询
SELECT * FROM uuid_example;

-- TimeUUID函数
SELECT now();           -- 生成当前时间的timeuuid
SELECT minTimeuuid('2024-01-15 10:30:00');  -- 最小timeuuid
SELECT maxTimeuuid('2024-01-15 10:30:00');  -- 最大timeuuid

5.2 TimeUUID排序特性 #

sql
-- 创建按时间排序的表
CREATE TABLE events_by_time (
    event_type TEXT,
    event_id TIMEUUID,
    data TEXT,
    PRIMARY KEY (event_type, event_id)
) WITH CLUSTERING ORDER BY (event_id DESC);

-- 插入事件
INSERT INTO events_by_time (event_type, event_id, data)
VALUES ('login', now(), '用户登录');

INSERT INTO events_by_time (event_type, event_id, data)
VALUES ('login', now(), '用户登录2');

-- 查询最新事件
SELECT * FROM events_by_time 
WHERE event_type = 'login' 
LIMIT 10;

六、其他基本类型 #

6.1 布尔类型 #

sql
-- 创建表
CREATE TABLE flags (
    id INT PRIMARY KEY,
    is_active BOOLEAN,
    is_verified BOOLEAN
);

-- 插入数据
INSERT INTO flags (id, is_active, is_verified)
VALUES (1, true, false);

INSERT INTO flags (id, is_active, is_verified)
VALUES (2, FALSE, TRUE);

-- 查询
SELECT * FROM flags WHERE is_active = true;

6.2 二进制类型 #

sql
-- 创建表
CREATE TABLE binary_data (
    id INT PRIMARY KEY,
    data BLOB
);

-- 插入十六进制数据
INSERT INTO binary_data (id, data)
VALUES (1, 0x48656c6c6f);

-- 插入文本转换的blob
INSERT INTO binary_data (id, data)
VALUES (2, textAsBlob('Hello'));

-- 查询并转换
SELECT id, blobAsText(data) FROM binary_data;

6.3 IP地址类型 #

sql
-- 创建表
CREATE TABLE network_events (
    id INT PRIMARY KEY,
    source_ip INET,
    dest_ip INET
);

-- 插入IPv4地址
INSERT INTO network_events (id, source_ip, dest_ip)
VALUES (1, '192.168.1.1', '10.0.0.1');

-- 插入IPv6地址
INSERT INTO network_events (id, source_ip, dest_ip)
VALUES (2, '2001:db8::1', '2001:db8::2');

-- 查询
SELECT * FROM network_events WHERE source_ip = '192.168.1.1';

七、集合类型 #

7.1 List类型 #

sql
-- 创建带List的表
CREATE TABLE users_with_list (
    user_id UUID PRIMARY KEY,
    name TEXT,
    tags LIST<TEXT>,
    scores LIST<INT>
);

-- 插入数据
INSERT INTO users_with_list (user_id, name, tags, scores)
VALUES (
    uuid(), 
    '张三', 
    ['vip', 'premium', 'active'], 
    [90, 85, 92]
);

-- 查询
SELECT * FROM users_with_list;

-- 追加元素
UPDATE users_with_list 
SET tags = tags + ['new_tag'] 
WHERE user_id = ?;

-- 前置插入
UPDATE users_with_list 
SET tags = ['first'] + tags 
WHERE user_id = ?;

-- 替换特定位置
UPDATE users_with_list 
SET tags[1] = 'updated_tag' 
WHERE user_id = ?;

-- 删除元素
UPDATE users_with_list 
SET tags = tags - ['vip'] 
WHERE user_id = ?;

-- 删除特定位置
DELETE tags[0] FROM users_with_list WHERE user_id = ?;

-- 查询包含某元素
SELECT * FROM users_with_list WHERE tags CONTAINS 'vip';

7.2 Set类型 #

sql
-- 创建带Set的表
CREATE TABLE users_with_set (
    user_id UUID PRIMARY KEY,
    name TEXT,
    emails SET<TEXT>,
    tags SET<TEXT>
);

-- 插入数据
INSERT INTO users_with_set (user_id, name, emails, tags)
VALUES (
    uuid(), 
    '张三', 
    {'zhangsan@example.com', 'zhangsan@work.com'}, 
    {'vip', 'premium'}
);

-- 添加元素
UPDATE users_with_set 
SET emails = emails + {'new@example.com'} 
WHERE user_id = ?;

-- 删除元素
UPDATE users_with_set 
SET emails = emails - {'old@example.com'} 
WHERE user_id = ?;

-- 查询包含某元素
SELECT * FROM users_with_set WHERE emails CONTAINS 'zhangsan@example.com';

-- 查询包含所有元素
SELECT * FROM users_with_set WHERE tags CONTAINS 'vip' AND tags CONTAINS 'premium';

7.3 Map类型 #

sql
-- 创建带Map的表
CREATE TABLE users_with_map (
    user_id UUID PRIMARY KEY,
    name TEXT,
    attributes MAP<TEXT, TEXT>,
    scores MAP<TEXT, INT>
);

-- 插入数据
INSERT INTO users_with_map (user_id, name, attributes, scores)
VALUES (
    uuid(), 
    '张三', 
    {'phone': '13800138000', 'city': '北京', 'country': '中国'}, 
    {'math': 90, 'english': 85, 'science': 92}
);

-- 添加键值对
UPDATE users_with_map 
SET attributes = attributes + {'email': 'new@example.com'} 
WHERE user_id = ?;

-- 更新特定键
UPDATE users_with_map 
SET attributes['phone'] = '13900139000' 
WHERE user_id = ?;

-- 删除键
DELETE attributes['email'] FROM users_with_map WHERE user_id = ?;

-- 查询包含某键
SELECT * FROM users_with_map WHERE attributes CONTAINS KEY 'phone';

-- 查询包含某值
SELECT * FROM users_with_map WHERE attributes CONTAINS '北京';

-- 查询特定键值
SELECT user_id, name, attributes['phone'] AS phone FROM users_with_map;

八、用户定义类型(UDT) #

8.1 创建UDT #

sql
-- 创建地址类型
CREATE TYPE address (
    street TEXT,
    city TEXT,
    state TEXT,
    zip_code TEXT,
    country TEXT
);

-- 创建联系方式类型
CREATE TYPE contact_info (
    email TEXT,
    phone TEXT,
    address FROZEN<address>
);

-- 使用UDT创建表
CREATE TABLE users_with_udt (
    user_id UUID PRIMARY KEY,
    name TEXT,
    home_address FROZEN<address>,
    work_address FROZEN<address>,
    contact FROZEN<contact_info>
);

8.2 插入UDT数据 #

sql
-- 插入嵌套UDT
INSERT INTO users_with_udt (user_id, name, home_address, work_address)
VALUES (
    uuid(),
    '张三',
    {
        street: '朝阳路100号',
        city: '北京',
        state: '北京市',
        zip_code: '100020',
        country: '中国'
    },
    {
        street: '中关村大街1号',
        city: '北京',
        state: '北京市',
        zip_code: '100080',
        country: '中国'
    }
);

-- 插入包含嵌套UDT的数据
INSERT INTO users_with_udt (user_id, name, contact)
VALUES (
    uuid(),
    '李四',
    {
        email: 'lisi@example.com',
        phone: '13800138000',
        address: {
            street: '南京路200号',
            city: '上海',
            state: '上海市',
            zip_code: '200000',
            country: '中国'
        }
    }
);

8.3 查询UDT数据 #

sql
-- 查询完整UDT
SELECT user_id, name, home_address FROM users_with_udt;

-- 查询UDT字段
SELECT user_id, name, home_address.city, home_address.zip_code 
FROM users_with_udt;

-- 查询嵌套UDT字段
SELECT user_id, name, contact.address.city 
FROM users_with_udt;

-- 使用WHERE条件
SELECT * FROM users_with_udt 
WHERE home_address.city = '北京';

8.4 更新UDT数据 #

sql
-- 更新整个UDT
UPDATE users_with_udt 
SET home_address = {
    street: '新地址',
    city: '上海',
    state: '上海市',
    zip_code: '200000',
    country: '中国'
}
WHERE user_id = ?;

-- 更新UDT字段
UPDATE users_with_udt 
SET home_address.city = '深圳' 
WHERE user_id = ?;

8.5 UDT集合 #

sql
-- 创建包含UDT集合的表
CREATE TABLE orders (
    order_id UUID PRIMARY KEY,
    customer_name TEXT,
    items LIST<FROZEN<order_item>>
);

-- 创建订单项类型
CREATE TYPE order_item (
    product_id UUID,
    product_name TEXT,
    quantity INT,
    price DECIMAL
);

-- 插入数据
INSERT INTO orders (order_id, customer_name, items)
VALUES (
    uuid(),
    '张三',
    [
        {
            product_id: uuid(),
            product_name: 'iPhone 15',
            quantity: 1,
            price: 7999.00
        },
        {
            product_id: uuid(),
            product_name: 'AirPods Pro',
            quantity: 1,
            price: 1999.00
        }
    ]
);

九、特殊类型 #

9.1 Counter类型 #

sql
-- 创建计数器表
CREATE TABLE page_views (
    page_id UUID PRIMARY KEY,
    view_count COUNTER
);

-- 创建多计数器表
CREATE TABLE user_stats (
    user_id UUID PRIMARY KEY,
    login_count COUNTER,
    post_count COUNTER,
    like_count COUNTER
);

-- 增加计数
UPDATE page_views SET view_count = view_count + 1 WHERE page_id = ?;

-- 减少计数
UPDATE page_views SET view_count = view_count - 1 WHERE page_id = ?;

-- 批量更新计数器
BEGIN BATCH
    UPDATE user_stats SET login_count = login_count + 1 WHERE user_id = ?;
    UPDATE user_stats SET post_count = post_count + 5 WHERE user_id = ?;
APPLY BATCH;

9.2 Tuple类型 #

sql
-- 创建带Tuple的表
CREATE TABLE coordinates (
    id INT PRIMARY KEY,
    point TUPLE<DOUBLE, DOUBLE>,
    data TUPLE<TEXT, INT, BOOLEAN>
);

-- 插入数据
INSERT INTO coordinates (id, point, data)
VALUES (1, (39.9042, 116.4074), ('北京', 1, true));

-- 查询Tuple字段
SELECT id, point, data FROM coordinates;

-- 查询特定Tuple元素
SELECT id, point.f1 AS latitude, point.f2 AS longitude 
FROM coordinates;

9.3 Frozen类型 #

sql
-- Frozen用于嵌套集合
CREATE TABLE nested_collections (
    id INT PRIMARY KEY,
    tags_map MAP<TEXT, FROZEN<LIST<TEXT>>>,
    nested_set SET<FROZEN<SET<INT>>>
);

-- 插入数据
INSERT INTO nested_collections (id, tags_map)
VALUES (1, {
    'category': ['tech', 'programming'],
    'level': ['beginner', 'intermediate']
});

十、类型转换 #

10.1 显式转换函数 #

sql
-- Blob转换
SELECT blobAsInt(intAsBlob(123));
SELECT blobAsText(textAsBlob('Hello'));
SELECT blobAsBigint(bigintAsBlob(1234567890));

-- 时间转换
SELECT toTimestamp(now());
SELECT toDate(now());
SELECT toUnixTimestamp(now());

-- UUID转换
SELECT uuid();
SELECT now();

10.2 JSON转换 #

sql
-- 从JSON创建
INSERT INTO users JSON '{
    "user_id": "123e4567-e89b-12d3-a456-426614174000",
    "name": "张三",
    "age": 30
}';

-- 输出为JSON
SELECT JSON * FROM users;

十一、数据类型选择建议 #

11.1 数值类型选择 #

场景 推荐类型 原因
主键ID UUID/INT 根据数据量选择
年龄 TINYINT 范围足够
数量 INT 通用选择
金额 DECIMAL 精确计算
科学计算 DOUBLE 高精度
大数值 BIGINT/VARINT 根据范围选择

11.2 文本类型选择 #

场景 推荐类型 原因
英文文本 ASCII/TEXT ASCII更节省空间
多语言文本 TEXT 支持UTF-8
长文本 TEXT 无长度限制

11.3 集合类型选择 #

场景 推荐类型 原因
有序列表 LIST 保持顺序
唯一值集合 SET 自动去重
键值对 MAP 快速查找

十二、总结 #

数据类型要点:

类型 特点 使用场景
基本类型 简单高效 常规数据存储
集合类型 灵活存储 多值字段
UDT 结构化 复杂数据结构
Counter 原子计数 统计计数

最佳实践:

  1. 选择合适的数据类型以优化存储
  2. 使用UDT组织复杂数据
  3. Counter表不能包含其他非主键列
  4. 合理使用Frozen嵌套集合
  5. 注意集合类型的大小限制

下一步,让我们学习分布式架构原理!

最后更新:2026-03-27