📊 MySQL 数据类型

MySQL 支持多种数据类型,分为数值类型、字符串类型、日期时间类型和 JSON 类型等。选择合适的数据类型对于数据库性能和存储效率至关重要。

🔄 MySQL 5.7 vs 8.x 数据类型差异

🔢 数值类型

整数类型

类型 字节 有符号范围 无符号范围 用途
TINYINT 1 -128 到 127 0 到 255 布尔值、状态码
SMALLINT 2 -32,768 到 32,767 0 到 65,535 年龄、数量
MEDIUMINT 3 -8,388,608 到 8,388,607 0 到 16,777,215 中等范围计数
INT/INTEGER 4 -2,147,483,648 到 2,147,483,647 0 到 4,294,967,295 主键、外键
BIGINT 8 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 0 到 18,446,744,073,709,551,615 大数值、时间戳
-- 整数类型示例 CREATE TABLE number_examples ( id INT AUTO_INCREMENT PRIMARY KEY, age TINYINT UNSIGNED, -- 年龄 (0-255) quantity SMALLINT, -- 数量 user_id INT UNSIGNED, -- 用户ID timestamp_val BIGINT, -- 时间戳 is_active BOOLEAN -- 布尔值 (TINYINT(1) 的别名) );

浮点和定点类型

类型 字节 精度 用途
FLOAT 4 单精度浮点 科学计算
DOUBLE 8 双精度浮点 高精度计算
DECIMAL(M,D) 变长 精确小数 金融、货币
-- 浮点类型示例 CREATE TABLE financial_data ( id INT AUTO_INCREMENT PRIMARY KEY, price DECIMAL(10,2), -- 价格,精确到分 weight FLOAT, -- 重量 coordinates DOUBLE, -- 坐标 percentage DECIMAL(5,2) -- 百分比 (999.99%) );

📝 字符串类型

类型 最大长度 存储需求 用途
CHAR(M) 255 字符 M 字节 固定长度字符串
VARCHAR(M) 65,535 字符 L+1 或 L+2 字节 可变长度字符串
TEXT 65,535 字符 L+2 字节 长文本
MEDIUMTEXT 16,777,215 字符 L+3 字节 中等长度文本
LONGTEXT 4,294,967,295 字符 L+4 字节 超长文本

MySQL 8.x 字符集改进

MySQL 8.x 默认字符集为 utf8mb4,完全支持 Unicode,包括 emoji 表情符号。

-- 字符串类型示例 CREATE TABLE content_table ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL, -- 用户名 email VARCHAR(100) NOT NULL, -- 邮箱 status CHAR(1) DEFAULT 'A', -- 状态码 title VARCHAR(200), -- 标题 content TEXT, -- 内容 description MEDIUMTEXT, -- 描述 full_content LONGTEXT -- 完整内容 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

二进制类型

类型 最大长度 用途
BINARY(M) 255 字节 固定长度二进制
VARBINARY(M) 65,535 字节 可变长度二进制
BLOB 65,535 字节 二进制大对象
MEDIUMBLOB 16,777,215 字节 中等二进制对象
LONGBLOB 4,294,967,295 字节 大型二进制对象

📅 日期时间类型

类型 格式 范围 用途
DATE YYYY-MM-DD 1000-01-01 到 9999-12-31 日期
TIME HH:MM:SS -838:59:59 到 838:59:59 时间
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 00:00:01 到 2038-01-19 03:14:07 时间戳
YEAR YYYY 1901 到 2155 年份
-- 日期时间类型示例 CREATE TABLE event_table ( id INT AUTO_INCREMENT PRIMARY KEY, event_date DATE, -- 事件日期 event_time TIME, -- 事件时间 created_at DATETIME DEFAULT CURRENT_TIMESTAMP, -- 创建时间 updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, -- 更新时间 birth_year YEAR -- 出生年份 ); -- 插入示例数据 INSERT INTO event_table (event_date, event_time, birth_year) VALUES ('2024-01-15', '14:30:00', 1990);

🎯 特殊类型

JSON 类型(MySQL 5.7+)

MySQL 8.x JSON 增强功能

  • 更多 JSON 函数:JSON_TABLE(), JSON_ARRAYAGG(), JSON_OBJECTAGG()
  • JSON 路径表达式增强
  • 更好的 JSON 索引支持
-- JSON 类型示例 CREATE TABLE user_profiles ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50), profile JSON, -- JSON 数据 settings JSON ); -- 插入 JSON 数据 INSERT INTO user_profiles (username, profile, settings) VALUES ('john_doe', '{"age": 30, "city": "Beijing", "hobbies": ["reading", "coding"]}', '{"theme": "dark", "notifications": true, "language": "zh-CN"}' ); -- 查询 JSON 数据 (MySQL 5.7+) SELECT username, JSON_EXTRACT(profile, '$.age') as age, JSON_EXTRACT(profile, '$.city') as city FROM user_profiles; -- MySQL 8.x 简化语法 SELECT username, profile->>'$.age' as age, profile->>'$.city' as city FROM user_profiles;

ENUM 和 SET 类型

-- ENUM 和 SET 类型示例 CREATE TABLE user_preferences ( id INT AUTO_INCREMENT PRIMARY KEY, status ENUM('active', 'inactive', 'pending') DEFAULT 'pending', -- 枚举 permissions SET('read', 'write', 'delete', 'admin'), -- 集合 priority ENUM('low', 'medium', 'high') DEFAULT 'medium' ); -- 插入数据 INSERT INTO user_preferences (status, permissions, priority) VALUES ('active', 'read,write', 'high'), ('pending', 'read', 'low');

💡 数据类型选择建议

⚠️ 版本兼容性注意事项