未记录事实核验 · 状态:维护中

记录仅说明核验时间与维护状态,不保证适用于所有环境;使用前请留意正文中的版本、适用条件与风险提示。

warning 适用边界与维护说明

本文适合已有SQL建表、索引和约束基础的读者学习综合类型选型,不是经过执行验证的生产部署脚本;本次仅作全文结构审阅,未作外部事实核验或数据库运行测试。多数示例使用MySQL方言,CHECK实际执行需MySQL 8.0.16或更高版本,旧式浮点声明及跨库DDL需按目标版本调整;商品表需预先存在字段类型匹配的类目、品牌父表。时区转换查询以UTC会话为前提,固定-05:00不处理夏令时;存储负载估算和索引示例不能用于承诺实际节省比例或提速。时间序列表的秒级时间戳与设备、时间复合主键只允许同一设备每秒保存一条记录,不适合直接承接同设备每秒多次采样;日志表示例没有字符型字段,其latin1设置不能作为该表节省字段存储空间的依据。银行和电商案例仅展示类型选择,不构成完整生产业务模型。

SQL数据类型系统 - 数据存储与性能优化的技术基础

tip 学习目标

本文将深入介绍SQL数据类型系统,包括各种数据类型的技术特性、存储机制、性能影响以及在不同数据库系统中的差异。

核心内容:

  • SQL标准数据类型体系与分类原理
  • 各主流数据库的数据类型实现差异
  • 数据类型选择对性能和存储的影响
  • 企业级数据建模中的类型选择策略

学习价值:正确的数据类型选择是数据库性能优化和存储效率的基础,对数据库设计至关重要。

abstract 本节概览

  • 学习目标:掌握SQL数据类型系统和选择策略
  • 技能价值:具备数据库性能优化的基础能力
  • 预计用时:30分钟
  • 学习成果:能够根据业务需求选择最优数据类型
  • 应用前景:为数据库设计和优化提供技术支撑

SQL标准数据类型体系

数据类型分类原理

数据类型(Data Type):定义数据的存储格式、取值范围、支持的操作以及占用的存储空间的规范。

常见SQL数据类型分类(包含不同数据库的扩展类型,并非全部属于SQL-92):

%%{init: {"theme":"base","themeVariables":{"fontFamily":"PingFang SC, -apple-system, Source Han Serif SC, serif","fontSize":"16px","background":"#FDFBF5","primaryColor":"#FDFBF5","primaryTextColor":"#2D2A26","primaryBorderColor":"#6E6A60","secondaryColor":"#E8EFE8","secondaryBorderColor":"#8FA890","secondaryTextColor":"#2D2A26","tertiaryColor":"#FDFBF5","tertiaryBorderColor":"#9A9488","tertiaryTextColor":"#6E6A60","lineColor":"#6E6A60","textColor":"#2D2A26","mainBkg":"#FDFBF5","nodeBorder":"#2D5A3D","clusterBkg":"#F3EEDF","clusterBorder":"#9A9488","edgeLabelBackground":"#FDFBF5"},"flowchart":{"htmlLabels":true,"curve":"basis","padding":20,"nodeSpacing":60,"rankSpacing":70,"useMaxWidth":false},"themeCSS":".node rect, .node polygon, .node circle { stroke-width: 1.5px; } .edgePath .path { stroke-width: 1.5px; } .cluster-label .nodeLabel, .cluster-label foreignObject { color: #2D2A26 !important; } .edgeLabel, .edgeLabel foreignObject { color: #2D2A26 !important; background-color: #FDFBF5; } .edgeLabel rect { fill: #FDFBF5; }"}}%%
graph TD
    classDef default fill:#FDFBF5,stroke:#6E6A60,color:#2D2A26,stroke-width:1.5px
    classDef startend fill:#2D2A26,stroke:#2D2A26,color:#FDFBF5,font-weight:bold
    classDef decision fill:#F6EAD8,stroke:#C08A1A,color:#2D2A26,font-weight:bold
    classDef hub fill:#3B5A80,stroke:#3B5A80,color:#FDFBF5,font-weight:bold
    classDef io fill:#E5EAF0,stroke:#3B5A80,color:#2D2A26
    classDef accent fill:#A6432C,stroke:#A6432C,color:#FDFBF5,font-weight:bold
    classDef storage fill:#F3EEDF,stroke:#9A9488,color:#2D2A26
    A[SQL数据类型] --> B[精确数值类型]
    A --> C[近似数值类型]
    A --> D[字符串类型]
    A --> E[日期时间类型]
    A --> F[二进制类型]
    A --> G[布尔类型]
    A --> H[复合类型]
    
    B --> B1[INTEGER/INT]
    B --> B2[SMALLINT]
    B --> B3[BIGINT]
    B --> B4[DECIMAL/NUMERIC]
    
    C --> C1[REAL]
    C --> C2[DOUBLE PRECISION]
    C --> C3[FLOAT]
    
    D --> D1[CHAR]
    D --> D2[VARCHAR]
    D --> D3[TEXT/CLOB]
    
    E --> E1[DATE]
    E --> E2[TIME]
    E --> E3[TIMESTAMP]
    E --> E4[INTERVAL]
    class A,B,C,D,E,F,G,H,B1,B2,B3,B4,C1,C2,C3,D1,D2,D3,E1,E2,E3,E4 default

数值类型详解

整数类型(Integer Types)

技术特性对比:

类型 MySQL存储空间 PostgreSQL存储 取值范围 适用场景
TINYINT 1字节 - -128 ~ 127 状态码、枚举值
SMALLINT 2字节 2字节 -32,768 ~ 32,767 年龄、数量
MEDIUMINT 3字节 - -8,388,608 ~ 8,388,607 中等规模ID
INT/INTEGER 4字节 4字节 -2,147,483,648 ~ 2,147,483,647 主键、用户ID
BIGINT 8字节 8字节 -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 大规模ID、金额

实际应用示例(MySQL方言):

本文MySQL示例中的CHECK约束需要MySQL 8.0.16或更高版本才会实际执行;在更早版本中,不能依赖这些声明阻止违反条件的数据写入。FLOAT(M,D)和DOUBLE(M,D)是MySQL旧式非标准声明,不应视为跨数据库通用写法。

-- 电商系统数据类型选择
CREATE TABLE ecommerce_entities (
    -- 用户ID:预计千万级别用户
    user_id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    
    -- 商品ID:预计百万级别商品
    product_id INT UNSIGNED NOT NULL,
    
    -- 订单数量:通常不超过1000
    quantity SMALLINT UNSIGNED DEFAULT 1 CHECK (quantity > 0),
    
    -- 商品状态:有限枚举值
    status TINYINT UNSIGNED DEFAULT 1 COMMENT '1:正常 2:下架 3:删除',
    
    -- 创建年份:用于分区
    created_year SMALLINT UNSIGNED NOT NULL
);

性能优化考量:

-- 优化前:使用过大的数据类型
CREATE TABLE users_inefficient (
    user_id BIGINT,           -- 浪费4字节
    age BIGINT,              -- 浪费7字节
    status VARCHAR(50)       -- 浪费大量空间
);

-- 优化后:精确选择数据类型
CREATE TABLE users_optimized (
    user_id INT UNSIGNED,         -- 节省4字节,支持42亿用户
    age TINYINT UNSIGNED,         -- 节省7字节,0-255范围足够
    status ENUM('active', 'inactive', 'suspended')  -- 有限枚举可减少值的存储空间;查询性能取决于索引和负载
);

-- 存储空间对比
-- 简化假设:忽略长度信息、NULL位图及行存储开销,并假设原status值占50字节
-- users_inefficient字段值负载估算:8 + 8 + 50 = 66字节
-- users_optimized字段值负载估算:4 + 1 + 1 = 6字节
-- 在上述假设下字段值负载减少约90.9%,不代表实际每行或整表节省比例

精确数值类型(Exact Numeric Types)

DECIMAL/NUMERIC类型特性:

-- 金融系统精确数值处理
CREATE TABLE financial_transactions (
    transaction_id BIGINT PRIMARY KEY AUTO_INCREMENT,
    
    -- 交易金额:最大999,999,999.99,精确到分
    amount DECIMAL(11,2) NOT NULL CHECK (amount > 0),
    
    -- 汇率:精确到小数点后6位
    exchange_rate DECIMAL(10,6) NOT NULL,
    
    -- 手续费率:百分比,精确到小数点后4位
    fee_rate DECIMAL(6,4) DEFAULT 0.0000,
    
    -- 计算结果示例
    converted_amount DECIMAL(15,2) GENERATED ALWAYS AS (amount * exchange_rate) STORED
);

-- 插入示例数据
INSERT INTO financial_transactions (amount, exchange_rate, fee_rate) VALUES
(1000.50, 6.8945, 0.0025),  -- 人民币转美元
(50000.00, 0.1451, 0.0030); -- 日元转人民币

浮点数类型的使用场景:

-- 科学计算和统计分析场景
CREATE TABLE scientific_data (
    experiment_id INT PRIMARY KEY,
    
    -- 温度测量:FLOAT精度足够
    temperature FLOAT(7,2),  -- MySQL旧式声明:共7位,其中2位小数;声明范围为-99999.99 ~ 99999.99,存储仍为近似值
    
    -- 坐标近似值:使用DOUBLE;实际定位精度取决于数据来源
    latitude DOUBLE(10,8),   -- 小数位声明不保证实际定位达到米级精度
    longitude DOUBLE(11,8),
    
    -- 计算密集型数据:性能优先
    calculation_result DOUBLE NOT NULL
);

字符串类型详解

字符串类型选择策略

固定长度 vs 可变长度:

-- 字符串类型性能对比测试
CREATE TABLE string_performance_test (
    id INT PRIMARY KEY,
    
    -- 固定长度:适合长度固定的数据
    country_code CHAR(2),        -- ISO国家代码,始终2位
    phone_prefix CHAR(4),        -- 电话区号,固定4位
    
    -- 可变长度:适合长度变化的数据
    username VARCHAR(50),        -- 用户名,5-50字符
    email VARCHAR(320),          -- 邮箱地址,最大320字符
    description TEXT,            -- 商品描述,长度不固定
    
    -- 性能分析
    INDEX idx_country (country_code),      -- 是否有效加速取决于选择性、查询条件和执行计划
    INDEX idx_username (username(20))      -- VARCHAR部分索引优化
);

字符集和排序规则选择:

-- 多语言支持的电商平台
CREATE TABLE multilingual_products (
    product_id INT PRIMARY KEY,
    
    -- 产品名称:支持多语言,使用UTF8MB4
    name VARCHAR(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,
    
    -- SKU编码:仅英数字,使用Latin1节省空间
    sku VARCHAR(50) CHARACTER SET latin1 COLLATE latin1_general_ci,
    
    -- 描述:支持emoji,使用UTF8MB4
    description TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,
    
    -- 全文搜索索引
    FULLTEXT KEY ft_name_desc (name, description)
);

-- 字符集存储空间对比
-- latin1: 1字节/字符
-- utf8: 1-3字节/字符  
-- utf8mb4: 1-4字节/字符

文本搜索优化

-- 全文搜索功能实现
CREATE TABLE articles (
    article_id INT PRIMARY KEY AUTO_INCREMENT,
    title VARCHAR(500) NOT NULL,
    content LONGTEXT NOT NULL,
    tags VARCHAR(1000),
    
    -- 创建全文索引
    FULLTEXT(title, content, tags)
) ENGINE=InnoDB;

-- 高效的全文搜索查询
SELECT article_id, title,
       MATCH(title, content, tags) AGAINST('数据库优化' IN BOOLEAN MODE) as relevance_score
FROM articles 
WHERE MATCH(title, content, tags) AGAINST('数据库 +优化 -删除' IN BOOLEAN MODE)
ORDER BY relevance_score DESC
LIMIT 20;

日期时间类型详解

日期时间类型特性

类型对比与选择(以下为MySQL;时间范围按通常的有效值范围描述):

表中TIME、DATETIME和TIMESTAMP的字节数按MySQL 5.6.4起的存储格式、无小数秒精度计算;指定小数秒精度1—2、3—4、5—6时分别额外占用1、2、3字节。旧格式DATETIME为8字节。

类型 存储空间 时区支持 精度 范围 适用场景
DATE 3字节 无 日 1000-01-01 ~ 9999-12-31 生日、日期
TIME 3字节 无 秒 -838:59:59 ~ 838:59:59 营业时间
DATETIME 5字节(无小数秒,现代格式) 无 秒,可指定小数秒精度 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 创建时间
TIMESTAMP 4字节 有 秒 1970-01-01 00:00:01 ~ 2038-01-19 03:14:07 日志记录

企业级时间处理方案:

-- 全球化应用的时间管理
CREATE TABLE global_events (
    event_id BIGINT PRIMARY KEY AUTO_INCREMENT,
    
    -- 事件发生的本地时间(不含时区信息)
    local_datetime DATETIME NOT NULL,
    
    -- UTC标准时间(含时区转换)
    utc_timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    
    -- 事件日期(用于按日统计)
    event_date DATE GENERATED ALWAYS AS (DATE(local_datetime)) STORED,
    
    -- 事件小时(用于按小时统计)
    event_hour TINYINT GENERATED ALWAYS AS (HOUR(local_datetime)) STORED,
    
    -- 时区信息(单独存储)
    timezone_offset SMALLINT COMMENT '时区偏移分钟数',
    
    -- 索引优化
    KEY idx_date_hour (event_date, event_hour),
    KEY idx_utc_timestamp (utc_timestamp)
);

-- 时区转换查询示例
SELECT 
    event_id,
    local_datetime,
    utc_timestamp,
    -- 转换为指定时区
    CONVERT_TZ(utc_timestamp, '+00:00', '+08:00') AS beijing_time,
    CONVERT_TZ(utc_timestamp, '+00:00', '-05:00') AS fixed_minus_05_time
FROM global_events
WHERE event_date = '2024-12-11';

时间序列数据优化

-- 高频时间序列数据表设计
CREATE TABLE metrics_data (
    metric_id BIGINT AUTO_INCREMENT,
    
    -- 时间戳:秒级精度足够,使用TIMESTAMP节省空间
    recorded_at TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP,
    
    -- 设备ID:假设设备数量在百万级别
    device_id INT UNSIGNED NOT NULL,
    
    -- 指标值:使用适当精度的数值类型
    cpu_usage DECIMAL(5,2) CHECK (cpu_usage >= 0 AND cpu_usage <= 100),
    memory_usage BIGINT UNSIGNED, -- 字节数
    temperature FLOAT(4,1),       -- 温度,1位小数
    
    -- 复合主键优化查询
    PRIMARY KEY (device_id, recorded_at),
    
    -- 自增列必须作为某个索引的首列;该非唯一索引不额外保证metric_id全表唯一
    KEY idx_metric_id (metric_id),
    KEY idx_time (recorded_at)
) PARTITION BY RANGE (UNIX_TIMESTAMP(recorded_at)) (
    -- 使用固定UTC秒数,避免分区边界受建表会话时区影响
    PARTITION p202412 VALUES LESS THAN (1735689600),
    PARTITION p202501 VALUES LESS THAN (1738368000),
    PARTITION p202502 VALUES LESS THAN (1740787200),
    PARTITION p_future VALUES LESS THAN MAXVALUE
);

高级数据类型

JSON数据类型

MySQL 5.7+ JSON类型特性:

-- 现代应用的灵活数据存储
CREATE TABLE user_profiles (
    user_id INT PRIMARY KEY,
    username VARCHAR(50) NOT NULL,
    
    -- JSON存储用户配置
    preferences JSON,
    
    -- JSON存储用户元数据
    metadata JSON,
    
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    
    -- MySQL 5.7+:通过有界字符串生成列索引JSON标量;示例假设语言值不超过16字符
    preferred_language VARCHAR(16) GENERATED ALWAYS AS (JSON_UNQUOTE(JSON_EXTRACT(preferences, '$.language'))) STORED,
    INDEX idx_pref_lang (preferred_language)
);

-- 插入JSON数据
INSERT INTO user_profiles (user_id, username, preferences, metadata) VALUES
(1, 'alice', 
 '{"language": "zh-CN", "theme": "dark", "notifications": {"email": true, "sms": false}}',
 '{"registration_source": "mobile_app", "referrer": "google", "tags": ["vip", "early_adopter"]}'
),
(2, 'bob',
 '{"language": "en-US", "theme": "light", "notifications": {"email": false, "sms": true}}',
 '{"registration_source": "web", "last_login_device": "desktop"}'
);

-- JSON数据查询
SELECT 
    username,
    JSON_EXTRACT(preferences, '$.language') AS preferred_language,
    JSON_EXTRACT(preferences, '$.theme') AS theme,
    JSON_CONTAINS(JSON_EXTRACT(metadata, '$.tags'), '"vip"') AS is_vip
FROM user_profiles
WHERE JSON_EXTRACT(preferences, '$.notifications.email') = true;

数组和复合类型(PostgreSQL)

-- PostgreSQL特有的高级数据类型
CREATE TABLE product_catalog (
    product_id SERIAL PRIMARY KEY,
    name VARCHAR(200) NOT NULL,
    
    -- 数组类型:存储标签
    tags TEXT[],
    
    -- 数组类型:存储价格历史
    price_history DECIMAL(10,2)[],
    
    -- JSONB类型:更高效的JSON存储
    specifications JSONB,
    
    -- 几何类型:存储二维点坐标,不自带地理坐标系语义
    location POINT
);

-- PostgreSQL索引在建表后单独创建
CREATE INDEX idx_catalog_tags ON product_catalog USING gin (tags);
CREATE INDEX idx_catalog_specifications ON product_catalog USING gin (specifications);

-- 插入复杂数据
INSERT INTO product_catalog (name, tags, price_history, specifications, location) VALUES
('Smart Phone X', 
 ARRAY['electronics', 'mobile', '5G'],
 ARRAY[999.99, 899.99, 799.99],
 '{"screen": {"size": 6.1, "resolution": "2532x1170"}, "camera": {"main": "12MP", "ultra_wide": "12MP"}}',
 POINT(39.9042, 116.4074)
);

-- 数组和JSONB查询
SELECT name, tags, specifications->'screen'->>'size' AS screen_size
FROM product_catalog 
WHERE 'electronics' = ANY(tags)
AND specifications @> '{"camera": {"main": "12MP"}}';

数据类型选择最佳实践

性能优化策略

存储空间优化:

-- 大表存储优化示例:用户行为日志
CREATE TABLE user_behavior_logs (
    -- 自增ID:预计十亿级数据,使用BIGINT
    log_id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    
    -- 用户ID:千万级用户,INT足够
    user_id INT UNSIGNED NOT NULL,
    
    -- 行为类型:有限枚举,使用TINYINT
    action_type TINYINT UNSIGNED NOT NULL COMMENT '1:登录 2:浏览 3:购买 4:退出',
    
    -- 页面ID:百万级页面,INT足够  
    page_id INT UNSIGNED,
    
    -- 会话时长:秒数,MEDIUMINT可存储4600+小时
    session_duration MEDIUMINT UNSIGNED,
    
    -- IP地址:使用INT存储IPv4,节省空间
    ip_address INT UNSIGNED,
    
    -- 时间戳:使用TIMESTAMP,自动时区处理
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    
    -- 优化索引设计
    KEY idx_user_time (user_id, created_at),
    KEY idx_action_time (action_type, created_at),
    KEY idx_time (created_at)
    
) ENGINE=InnoDB 
  DEFAULT CHARSET=latin1  -- 日志表使用latin1节省空间
  ROW_FORMAT=COMPRESSED;  -- 启用行压缩

查询性能优化:

-- 类型比较示例:是否使用索引需结合转换方向和执行计划判断
SELECT user_id FROM user_behavior_logs 
WHERE user_id = '12345';  -- MySQL中整数列与该字符串常量比较通常仍可使用索引,不能据此认定索引失效

-- 优化后:类型匹配,利用索引
SELECT user_id FROM user_behavior_logs 
WHERE user_id = 12345;    -- 类型匹配,高效利用索引

-- 优化前:范围查询使用不当类型
CREATE TABLE orders (
    order_date DATETIME,
    amount VARCHAR(20)    -- 金额存储为字符串
);

-- 优化后:使用正确的数据类型
CREATE TABLE orders_optimized (
    order_date DATE,           -- 日期查询优化
    amount DECIMAL(12,2),      -- 数值计算优化
    
    KEY idx_date (order_date),
    KEY idx_amount (amount)
);

跨数据库兼容性策略

主流数据库差异处理:

-- 多数据库类型选型示例:下列DDL仍需按目标数据库调整,不能直接跨库执行
CREATE TABLE universal_users (
    user_id BIGINT NOT NULL,
    
    -- 字符串类型:各数据库通用
    username VARCHAR(50) NOT NULL,
    email VARCHAR(320),
    
    -- 数值类型:标准SQL兼容
    balance DECIMAL(15,2) DEFAULT 0.00,
    
    -- 日期时间:使用标准类型
    created_date DATE NOT NULL,
    last_login TIMESTAMP,
    
    -- 布尔类型兼容处理
    is_active TINYINT(1) DEFAULT 1,  -- MySQL/MariaDB
    -- is_active BOOLEAN DEFAULT TRUE,  -- PostgreSQL/SQLite
    
    -- 文本类型
    profile_data TEXT,
    
    PRIMARY KEY (user_id)
);

企业级数据建模案例

金融系统数据类型设计

-- 银行核心系统账户表
CREATE TABLE bank_accounts (
    -- 账户ID:使用字符串保持兼容性
    account_id VARCHAR(20) PRIMARY KEY,
    
    -- 客户ID:数值型,支持大量客户
    customer_id BIGINT UNSIGNED NOT NULL,
    
    -- 账户余额:精确数值,防止舍入误差
    balance DECIMAL(20,2) NOT NULL DEFAULT 0.00,
    
    -- 可用余额:考虑冻结金额
    available_balance DECIMAL(20,2) NOT NULL DEFAULT 0.00,
    
    -- 账户类型:枚举优化存储
    account_type ENUM('savings', 'checking', 'credit', 'loan') NOT NULL,
    
    -- 币种:ISO标准3字符代码
    currency_code CHAR(3) NOT NULL DEFAULT 'CNY',
    
    -- 利率:支持负利率,精确到0.0001%
    interest_rate DECIMAL(8,4) DEFAULT 0.0000,
    
    -- 状态标志:位运算优化
    status_flags INT UNSIGNED DEFAULT 0 COMMENT 'bit0:激活 bit1:冻结 bit2:关闭 bit3:限制',
    
    -- 创建时间:业务时间用DATETIME
    created_at DATETIME NOT NULL,
    
    -- 最后更新:系统时间用TIMESTAMP
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    
    -- 约束和索引
    CONSTRAINT chk_balance_positive CHECK (balance >= 0),
    CONSTRAINT chk_available_lte_balance CHECK (available_balance <= balance),
    
    KEY idx_customer (customer_id),
    KEY idx_type_status (account_type, status_flags),
    KEY idx_created (created_at)
);

电商系统商品表设计

-- 电商平台商品主表
CREATE TABLE ecommerce_products (
    -- 商品ID:支持大量SKU
    product_id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    
    -- SKU编码:业务标识
    sku_code VARCHAR(50) UNIQUE NOT NULL,
    
    -- 商品名称:支持多语言
    product_name VARCHAR(500) CHARACTER SET utf8mb4 NOT NULL,
    
    -- 类目ID:层级类目支持
    category_id INT UNSIGNED NOT NULL,
    
    -- 品牌ID:可选字段
    brand_id INT UNSIGNED,
    
    -- 价格信息:精确到分
    original_price DECIMAL(12,2) NOT NULL CHECK (original_price > 0),
    selling_price DECIMAL(12,2) NOT NULL CHECK (selling_price > 0),
    cost_price DECIMAL(12,2) CHECK (cost_price >= 0),
    
    -- 库存数量:支持负库存预警
    stock_quantity INT NOT NULL DEFAULT 0,
    reserved_quantity INT UNSIGNED DEFAULT 0,
    
    -- 商品属性:JSON存储灵活属性
    attributes JSON COMMENT '{"color": "red", "size": "XL", "weight": 0.5}',
    
    -- 状态和标志
    status ENUM('draft', 'active', 'inactive', 'deleted') DEFAULT 'draft',
    is_featured BOOLEAN DEFAULT FALSE,
    
    -- 时间戳
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    published_at TIMESTAMP NULL,
    
    -- 性能优化索引
    KEY idx_sku (sku_code),
    KEY idx_category_status (category_id, status),
    KEY idx_price_range (selling_price, status),
    KEY idx_stock (stock_quantity, status),
    KEY idx_created (created_at),
    
    -- MySQL 5.7+:通过有界字符串生成列索引;示例假设颜色和尺寸值均不超过64字符
    attr_color VARCHAR(64) GENERATED ALWAYS AS (JSON_UNQUOTE(JSON_EXTRACT(attributes, '$.color'))) STORED,
    attr_size VARCHAR(64) GENERATED ALWAYS AS (JSON_UNQUOTE(JSON_EXTRACT(attributes, '$.size'))) STORED,
    INDEX idx_attr_color (attr_color),
    INDEX idx_attr_size (attr_size),
    
    -- 外键约束
    FOREIGN KEY (category_id) REFERENCES product_categories(category_id),
    FOREIGN KEY (brand_id) REFERENCES brands(brand_id)
);

知识连接

学习检验

理论掌握检验:

  • [ ] 能够准确说明各种数据类型的存储空间和取值范围
  • [ ] 理解字符集和排序规则对字符串类型的影响
  • [ ] 掌握精确数值与近似数值的区别和应用场景
  • [ ] 了解不同数据库系统的数据类型差异

实践能力检验:

  • [ ] 能够根据业务需求选择最优的数据类型
  • [ ] 掌握JSON等复杂数据类型的使用方法
  • [ ] 能够设计存储空间优化的表结构
  • [ ] 具备跨数据库兼容的数据类型选择能力

总结要点

数据类型选择原则:

  • 根据数据范围选择最小的合适类型,优化存储空间
  • 考虑业务增长,预留适当的数据范围余量
  • 优先选择标准SQL类型,保证跨数据库兼容性
  • 合理使用高级数据类型,平衡灵活性与性能

性能优化策略:

  • 精确的数据类型选择可以显著减少存储空间
  • 正确的类型匹配避免隐式转换,提升查询性能
  • 字符集选择影响存储效率和查询速度
  • 复合数据类型(JSON、数组)提供灵活性但需谨慎使用

企业应用考量:

  • 金融系统优先考虑数据精度,使用DECIMAL类型
  • 大数据场景注重存储效率,精确选择类型大小
  • 全球化应用重视字符集支持和时区处理
  • 高并发系统关注类型选择对性能的影响

#SQL #数据类型 #性能优化 #数据库设计

学习路径: