
在创建数据表之前,必须先了解 MySQL 的数据类型——选对类型,事半功倍!
一、数值类型
整数类型
| 类型 | 存储空间 | 取值范围(有符号) | 用途 |
|---|
TINYINT | 1 字节 | -128 ~ 127 | 年龄、状态码 |
SMALLINT | 2 字节 | -32768 ~ 32767 | 小范围计数 |
MEDIUMINT | 3 字节 | -8388608 ~ 8388607 | 中等范围 |
INT | 4 字节 | -21亿 ~ 21亿 | 最常用整数 |
BIGINT | 8 字节 | ±922亿亿 | 超大数字 |
CREATE TABLE example_int (
age TINYINT UNSIGNED, -- 0~255,适合年龄
user_id INT UNSIGNED, -- 无符号自增ID
population BIGINT -- 人口数
);
浮点与定点数
| 类型 | 说明 | 示例 |
|---|
FLOAT(M,D) | 单精度浮点数 | FLOAT(7,4) |
DOUBLE(M,D) | 双精度浮点数 | DOUBLE(10,2) |
DECIMAL(M,D) | 定点数(精确) | DECIMAL(10,2) 适合金额 |
注意 重要:涉及金额、价格等精确计算时,必须使用 DECIMAL,不要用 FLOAT 或 DOUBLE,否则会出现精度丢失!
二、字符串类型
| 类型 | 最大长度 | 说明 |
|---|
CHAR(N) | 255 字符 | 固定长度,效率高 |
VARCHAR(N) | 65535 字节 | 可变长度,节省空间 |
TEXT | 65535 字节 | 长文本内容 |
MEDIUMTEXT | 16MB | 中长文本 |
LONGTEXT | 4GB | 超大文本 |
CREATE TABLE example_string (
username VARCHAR(50), -- 用户名(可变)
gender CHAR(1), -- 性别(固定长度)
bio TEXT, -- 个人简介
email VARCHAR(100)
);
CHAR vs VARCHAR 怎么选?
| 场景 | 推荐 |
|---|
| 固定长度(手机号、身份证) | CHAR |
| 长度变化大(用户名、标题) | VARCHAR |
| 超过 255 字符 | TEXT |
三、日期时间类型
| 类型 | 格式 | 范围 | 用途 |
|---|
DATE | YYYY-MM-DD | 1000~9999 | 生日、日期 |
TIME | HH:MM:SS | -838~838 小时 | 时间段 |
DATETIME | YYYY-MM-DD HH:MM:SS | 1000~9999 | 最常用 |
TIMESTAMP | YYYY-MM-DD HH:MM:SS | 1970~2038 | 自动更新 |
YEAR | YYYY | 1901~2155 | 年份 |
CREATE TABLE example_date (
birthday DATE, -- 生日
created_at DATETIME DEFAULT NOW(), -- 创建时间
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP -- 自动更新时间
);
提示 TIMESTAMP 会自动转换为 UTC 存储,而 DATETIME 不转换。跨时区应用建议用 TIMESTAMP。
四、创建数据表完整示例
-- 创建用户表
CREATE TABLE users (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE COMMENT '用户名',
password VARCHAR(255) NOT NULL COMMENT '密码哈希',
email VARCHAR(100) NOT NULL COMMENT '邮箱',
age TINYINT UNSIGNED DEFAULT 0 COMMENT '年龄',
gender ENUM('男','女','保密') DEFAULT '保密' COMMENT '性别',
balance DECIMAL(10,2) DEFAULT 0.00 COMMENT '账户余额',
status TINYINT DEFAULT 1 COMMENT '状态: 1=正常, 0=禁用',
created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '注册时间',
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
INDEX idx_email (email),
INDEX idx_status (status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户表';
关键约束说明
| 约束 | 作用 |
|---|
PRIMARY KEY | 主键,唯一标识一条记录 |
NOT NULL | 不允许为空 |
UNIQUE | 值必须唯一 |
DEFAULT | 设置默认值 |
AUTO_INCREMENT | 自动递增 |
COMMENT | 字段注释(强烈建议写上!) |
INDEX | 索引,加速查询 |
五、修改表结构
-- 添加字段
ALTER TABLE users ADD COLUMN phone VARCHAR(20) AFTER email;
-- 修改字段类型
ALTER TABLE users MODIFY COLUMN age TINYINT UNSIGNED NOT NULL DEFAULT 18;
-- 重命名字段
ALTER TABLE users CHANGE COLUMN phone mobile VARCHAR(20);
-- 删除字段
ALTER TABLE users DROP COLUMN mobile;
-- 查看表结构
DESC users;
-- 查看建表语句
SHOW CREATE TABLE users;
六、ENGINE 存储引擎
InnoDB(推荐)
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
| 特性 | InnoDB | MyISAM |
|---|
| 事务支持 | √ | × |
| 行级锁 | √ | × |
| 外键约束 | √ | × |
| 崩溃恢复 | √ | × |
| 全文索引 | √ 8.0+ | √ |
现代开发一律使用 InnoDB,MyISAM 只在特定只读场景下考虑。
本篇小结
√ 学会了 MySQL 的三大数据类型(数值、字符串、日期时间)
√ 掌握了 CHAR vs VARCHAR 的选择策略
√ 学会了创建规范的数据表
√ 理解了约束、索引、存储引擎的概念
下一篇我们将学习 数据的增删改查(CRUD)操作!
还没有评论
第一条回复通常最容易开启一场有价值的讨论。