1395 字
约 4 分钟
13
📊 MySQL 数据类型
2026-09-19
无标签

📊 MySQL 数据类型

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

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

  • 默认字符集:MySQL 8.x 默认使用 utf8mb4,MySQL 5.7 默认使用 latin1
  • JSON 增强:MySQL 8.x 提供了更多 JSON 函数和操作符
  • 几何类型:MySQL 8.x 对空间数据类型有更好的支持
  • 新增函数:MySQL 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');

💡 数据类型选择建议

  • 整数类型:根据数值范围选择最小的类型,节省存储空间
  • 字符串类型:固定长度用 CHAR,可变长度用 VARCHAR
  • 文本类型:短文本用 VARCHAR,长文本用 TEXT
  • 小数类型:精确计算用 DECIMAL,科学计算用 FLOAT/DOUBLE
  • 日期时间:需要时区转换用 TIMESTAMP,否则用 DATETIME
  • JSON 类型:存储结构化数据,但注意查询性能

⚠️ 版本兼容性注意事项

  • 字符集:从 MySQL 5.7 升级到 8.x 时注意字符集变化
  • JSON 函数:某些 JSON 函数仅在 MySQL 8.x 中可用
  • 默认值:MySQL 8.x 对默认值的处理更严格
  • SQL 模式:MySQL 8.x 默认启用更严格的 SQL 模式
📊 MySQL 数据类型
https://clxhxhhr.top/posts/2807/
作者
clxstart
发布于
2026-09-19
许可协议
CC BY-NC-SA 4.0
评论
0 条
还没有评论,先写一条吧。