Skip to content

第3章:MySQL 核心基础概念

3.1 数据库核心概念

通俗讲解

数据库(Database)

定义:存储数据的"容器",用于组织和管理相关数据。

类比:就像一个大仓库,里面可以存放各种货物(数据)。

示例

学校管理系统
├── 学生数据库(student_db)
├── 教师数据库(teacher_db)
└── 课程数据库(course_db)

数据表(Table)

定义:数据库中的"表格",用于分类存储数据,由行和列组成。

类比:就像 Excel 表格,有表头(字段)和数据行(记录)。

示例

学生表(students)
┌────┬────────┬─────┬────────┐
│ ID │  姓名   │ 年龄 │  班级   │
├────┼────────┼─────┼────────┤
│  1 │  张三   │  18 │ 一班   │
│  2 │  李四   │  19 │ 二班   │
│  3 │  王五   │  18 │ 一班   │
└────┴────────┴─────┴────────┘

字段(Field/Column)

定义:表格中的"列",定义了数据的属性。

常见字段

字段名说明示例值
id唯一标识1, 2, 3
name姓名张三, 李四
age年龄18, 19
class班级一班, 二班
email邮箱zhangsan@example.com

记录(Record/Row)

定义:表格中的"行",每一行对应一条完整的数据。

示例

一条学生记录:
ID: 1, 姓名: 张三, 年龄: 18, 班级: 一班

这行数据包含了该学生的所有信息

主键(Primary Key)

定义:唯一标识一条记录的字段,具有唯一性和非空性。

特点

  • 唯一性:每条记录的主键值都不同
  • 非空性:主键不能为空
  • 不可重复:不能有两条记录使用相同的主键

示例

sql
-- 学生表,使用 id 作为主键
CREATE TABLE students (
    id INT PRIMARY KEY,  -- 主键
    name VARCHAR(50),
    age INT
);

-- 数据示例
id: 1, name: '张三'  -- 合法
id: 2, name: '李四'  -- 合法
id: 1, name: '王五'  -- 错误!id 重复

概念关系图

数据库(Database)

    ├── 数据表1(Table)
    │       │
    │       ├── 字段1(Field)
    │       ├── 字段2(Field)
    │       └── 字段3(Field)

    │       记录1(Record): 值1, 值2, 值3
    │       记录2(Record): 值1, 值2, 值3
    │       记录3(Record): 值1, 值2, 值3

    ├── 数据表2(Table)
    │       │
    │       └── ...

    └── 数据表3(Table)

            └── ...

3.2 数据类型

常用数据类型

整数类型

类型大小范围(有符号)用途
TINYINT1 字节-128 ~ 127小范围整数(年龄、状态)
SMALLINT2 字节-32768 ~ 32767较小范围整数
INT4 字节-21亿 ~ 21亿常用整数(ID、数量)
BIGINT8 字节极大范围大整数(用户ID、订单号)

使用建议

sql
-- 年龄:使用 TINYINT(0-150 足够)
age TINYINT UNSIGNED

-- 用户ID:使用 INT(一般足够)
user_id INT

-- 订单号:使用 BIGINT(可能很大)
order_id BIGINT

字符串类型

类型说明最大长度用途
CHAR(n)固定长度255 字符固定长度(手机号、身份证号)
VARCHAR(n)可变长度65535 字符常用字符串(姓名、地址)
TEXT长文本65535 字节文章内容、描述
LONGTEXT超长文本4GB大文本(文章内容、日志)

CHAR vs VARCHAR

sql
-- CHAR(10):固定占用 10 个字符空间
-- 存储 'abc',实际占用 10 个字符(补空格)
phone CHAR(11)  -- 手机号,固定11位

-- VARCHAR(10):按实际长度存储
-- 存储 'abc',实际占用 3 个字符
name VARCHAR(50)  -- 姓名,长度不固定

使用建议

sql
-- 固定长度:CHAR
phone CHAR(11)          -- 手机号
id_card CHAR(18)        -- 身份证号

-- 可变长度:VARCHAR
name VARCHAR(50)        -- 姓名
email VARCHAR(100)      -- 邮箱
address VARCHAR(200)    -- 地址

-- 长文本:TEXT
description TEXT        -- 商品描述
content LONGTEXT        -- 文章内容

日期时间类型

类型格式用途
DATEYYYY-MM-DD日期(生日、纪念日)
TIMEHH:MM:SS时间
DATETIMEYYYY-MM-DD HH:MM:SS日期时间(创建时间、更新时间)
TIMESTAMPYYYY-MM-DD HH:MM:SS时间戳(自动更新)
YEARYYYY年份

使用示例

sql
-- 生日(只需要日期)
birthday DATE

-- 创建时间(日期时间)
created_at DATETIME

-- 自动记录更新时间
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

小数类型

类型说明用途
FLOAT单精度浮点数科学计算(精度要求不高)
DOUBLE双精度浮点数科学计算(精度要求较高)
DECIMAL(M,D)定点数金额(精确计算)

DECIMAL 说明

sql
-- DECIMAL(10, 2):总共10位,小数点后2位
-- 范围:-99999999.99 到 99999999.99

price DECIMAL(10, 2)  -- 商品价格,如 199.99

重要提示

sql
-- 金额计算必须使用 DECIMAL,避免精度丢失
-- 错误:使用 FLOAT/DOUBLE
price FLOAT  -- 可能导致 199.99 变成 199.9899999

-- 正确:使用 DECIMAL
price DECIMAL(10, 2)  -- 精确存储 199.99

其他类型

类型说明用途
BOOLEAN布尔值是/否、真/假(实际用 TINYINT(1))
ENUM枚举固定选项(性别:男/女)
SET集合多选(爱好:音乐/运动/阅读)
BLOB二进制数据图片、文件(不推荐直接存数据库)

使用示例

sql
-- 布尔值
is_active BOOLEAN  -- 1 表示 true,0 表示 false

-- 枚举
gender ENUM('男', '女')  -- 只能选择男或女

-- 集合
hobbies SET('音乐', '运动', '阅读', '旅游')  -- 可多选

数据类型选择技巧

选择原则

  1. 够用就好:不要过度设计,选择满足需求的最小类型
  2. 考虑扩展:预留一定扩展空间
  3. 性能优先:小类型比大类型性能更好
  4. 精确计算:金额等需要精确计算的使用 DECIMAL

常见场景推荐

sql
-- 用户表
CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT,      -- ID,自增
    username VARCHAR(50) NOT NULL,          -- 用户名
    email VARCHAR(100),                     -- 邮箱
    phone CHAR(11),                         -- 手机号,固定长度
    age TINYINT UNSIGNED,                   -- 年龄,小整数
    gender ENUM('男', '女'),                -- 性别,枚举
    birthday DATE,                          -- 生日,日期
    balance DECIMAL(10, 2),                 -- 余额,金额
    is_active BOOLEAN DEFAULT TRUE,         -- 是否激活
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,  -- 创建时间
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP  -- 更新时间
);

3.3 MySQL 编码设置

为什么需要设置编码?

问题:如果不设置编码,存储中文时可能出现乱码。

原因

  • 默认编码可能不支持中文
  • 客户端、服务器、数据库编码不一致

推荐编码:UTF-8(utf8mb4)

utf8 vs utf8mb4

  • utf8:MySQL 早期实现,最多 3 字节,不支持 emoji
  • utf8mb4:完整 UTF-8 实现,4 字节,支持所有字符(推荐)

查看当前编码

sql
-- 查看服务器字符集
SHOW VARIABLES LIKE 'character_set_server';

-- 查看数据库字符集
SHOW VARIABLES LIKE 'character_set_database';

-- 查看客户端字符集
SHOW VARIABLES LIKE 'character_set_client';

-- 查看所有字符集设置
SHOW VARIABLES LIKE 'character_set_%';

设置编码

1. 创建数据库时指定编码

sql
CREATE DATABASE mydb 
CHARACTER SET utf8mb4 
COLLATE utf8mb4_unicode_ci;

2. 创建表时指定编码

sql
CREATE TABLE users (
    id INT PRIMARY KEY,
    name VARCHAR(50)
) ENGINE=InnoDB 
DEFAULT CHARSET=utf8mb4 
COLLATE=utf8mb4_unicode_ci;

3. 修改数据库编码

sql
ALTER DATABASE mydb 
CHARACTER SET utf8mb4 
COLLATE utf8mb4_unicode_ci;

4. 修改表编码

sql
ALTER TABLE users 
CONVERT TO CHARACTER SET utf8mb4 
COLLATE utf8mb4_unicode_ci;

5. 客户端连接时设置编码

sql
-- 在连接后执行
SET NAMES utf8mb4;

-- 或在连接命令中指定
mysql -u root -p --default-character-set=utf8mb4

3.4 实操案例

创建第一个数据库

sql
-- 1. 登录 MySQL
mysql -u root -p

-- 2. 创建数据库(指定编码)
CREATE DATABASE school_db 
CHARACTER SET utf8mb4 
COLLATE utf8mb4_unicode_ci;

-- 3. 查看所有数据库
SHOW DATABASES;

-- 4. 使用数据库
USE school_db;

-- 5. 查看当前数据库
SELECT DATABASE();

创建第一个数据表

sql
-- 创建学生表
CREATE TABLE students (
    -- 主键:自增ID
    id INT PRIMARY KEY AUTO_INCREMENT,
    
    -- 学生姓名:必填,最长50字符
    name VARCHAR(50) NOT NULL,
    
    -- 年龄:小整数,无符号(0-255)
    age TINYINT UNSIGNED,
    
    -- 性别:枚举类型
    gender ENUM('男', '女') DEFAULT '男',
    
    -- 班级:可变长度字符串
    class VARCHAR(20),
    
    -- 手机号:固定长度
    phone CHAR(11),
    
    -- 邮箱:可变长度
    email VARCHAR(100),
    
    -- 入学日期:日期类型
    enrollment_date DATE,
    
    -- 是否在读:布尔值
    is_active BOOLEAN DEFAULT TRUE,
    
    -- 创建时间:自动记录
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    
    -- 更新时间:自动更新
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- 查看表结构
DESC students;

-- 查看创建表的SQL
SHOW CREATE TABLE students;

插入测试数据

sql
-- 插入单条数据
INSERT INTO students (name, age, gender, class, phone, email, enrollment_date) 
VALUES ('张三', 18, '男', '一班', '13800138000', 'zhangsan@example.com', '2024-09-01');

-- 插入多条数据
INSERT INTO students (name, age, gender, class, phone, email, enrollment_date) VALUES
('李四', 19, '女', '二班', '13800138001', 'lisi@example.com', '2024-09-01'),
('王五', 18, '男', '一班', '13800138002', 'wangwu@example.com', '2024-09-01'),
('赵六', 20, '女', '三班', '13800138003', 'zhaoliu@example.com', '2024-09-01');

-- 查询所有数据
SELECT * FROM students;

查询结果

+----+--------+------+--------+-------+-------------+----------------------+---------------------+-----------+---------------------+---------------------+
| id | name   | age  | gender | class | phone       | email                | enrollment_date     | is_active | created_at          | updated_at          |
+----+--------+------+--------+-------+-------------+----------------------+---------------------+-----------+---------------------+---------------------+
|  1 | 张三   |   18 | 男     | 一班  | 13800138000 | zhangsan@example.com | 2024-09-01          |         1 | 2024-01-15 10:30:00 | 2024-01-15 10:30:00 |
|  2 | 李四   |   19 | 女     | 二班  | 13800138001 | lisi@example.com     | 2024-09-01          |         1 | 2024-01-15 10:30:00 | 2024-01-15 10:30:00 |
|  3 | 王五   |   18 | 男     | 一班  | 13800138002 | wangwu@example.com   | 2024-09-01          |         1 | 2024-01-15 10:30:00 | 2024-01-15 10:30:00 |
|  4 | 赵六   |   20 | 女     | 三班  | 13800138003 | zhaoliu@example.com  | 2024-09-01          |         1 | 2024-01-15 10:30:00 | 2024-01-15 10:30:00 |
+----+--------+------+--------+-------+-------------+----------------------+---------------------+-----------+---------------------+---------------------+

小结

通过本章的学习,你掌握了:

  • ✅ 数据库核心概念(数据库、表、字段、记录、主键)
  • ✅ MySQL 常用数据类型及选择技巧
  • ✅ MySQL 编码设置(UTF-8/utf8mb4)
  • ✅ 创建了第一个数据库和数据表

这些基础概念是学习 SQL 语法的前提,理解它们将帮助你更好地掌握后续的内容。继续学习 第4章:SQL 基础入门

© 2026 编程马·菜鸟教程 版权所有