把MySQL的教程看到第三章的时候,我才真正有了"自己在操作数据库"的感觉。前两章基本在讲概念和安装,什么关系型数据库、什么SQL语言分类,看完脑子里装了一堆名词,真到键盘前还是不知道怎么下手。第三章不一样,这一章开始真正碰命令行,建库、建表、往表里插数据,再把这些数据查出来——整个流程一次走完,才算是把MySQL从"听说过"变成了"上手用过"。
这篇笔记记录的是我3月25日复习完第三章之后的整理。里面会包含建库建表的完整流程、增删改查的语法细节,还有我自己在练习时踩过的一些坑。如果你也是学到第三章的初学者,或者刚装好MySQL准备动手敲命令,这篇笔记应该能帮你少走不少弯路。安装环境无论Windows、Linux还是Docker都无所谓,SQL语法本身不区分平台,只要能进入mysql命令行就行。
1. 建库建表:第三章第一节,先把数据的地基打好
第三章一开始没有直接讲怎么查数据,而是先教怎么把库和表建出来。这一节语法很简单,但很多后面的坑其实从这一节就埋下了。
1.1 数据库的创建:字符集从第一步就要选对
建库的SQL简单到让人想跳过:
sql复制CREATE DATABASE student_db;
但如果你真的只用这一句,后面大概率会遇到乱码问题。原因是MySQL默认字符集在不同版本里不一样,5.7默认是latin1,8.0默认是utf8mb4。如果你在5.7上直接建库不指定字符集,插入中文时就会看到满屏的"???"。
建议建库时把字符集和排序规则一起指定:
sql复制CREATE DATABASE student_db
DEFAULT CHARACTER SET utf8mb4
DEFAULT COLLATE utf8mb4_unicode_ci;
这里解释一下为什么是utf8mb4而不是utf8。MySQL的utf8其实是utf8mb3,它最多只能存3个字节的字符,像emoji这种4字节字符根本存不进去。utf8mb4兼容所有Unicode字符,是后面所有版本的主流选择。排序规则我选的是utf8mb4_unicode_ci,它对字符的排序更接近Unicode标准,而且_ci结尾代表大小写不敏感(case insensitive)。
当时我一开始偷懒没指定,后来往表里插入一条包含emoji的备注数据,直接报错"Incorrect string value",查了很久才发现问题出在建库那一步。这个教训让我养成了一个习惯:以后所有建库、建表语句,字符集永远写全。
判断当前库的字符集可以用这个命令:
sql复制SHOW CREATE DATABASE student_db;
它会返回完整的建库语句,里面直接带着CHARSET的设定。如果已经建好了库想补救,可以用ALTER:
sql复制ALTER DATABASE student_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
但要注意,ALTER只改了库的默认字符集,已经建好的表还需要单独改。所以最好是在第一步就指定好,后面不要回头改。
1.2 表结构设计:字段类型决定数据的"上限"
建表的SQL长这样:
sql复制CREATE TABLE student (
id INT NOT NULL AUTO_INCREMENT,
student_no VARCHAR(20) NOT NULL,
name VARCHAR(50) NOT NULL,
gender TINYINT DEFAULT 0,
birthday DATE,
score DECIMAL(5, 2) DEFAULT 0,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id),
UNIQUE KEY uk_student_no (student_no)
) DEFAULT CHARSET=utf8mb4;
字段类型看起来就是几个英文单词,但选错的话,后面跑数据时会非常难受。我当时整理了一个对照表,觉得对初学者来说特别有用:
| 类型 | 存储空间 | 取值范围或说明 |
|---|---|---|
| TINYINT | 1字节 | -128~127,或0~255(无符号),适合存性别、状态这类小整数 |
| INT | 4字节 | -2147483648~2147483647,最常用的整数类型 |
| BIGINT | 8字节 | 很大的整数,一般数据不会超过INT范围,但某些统计类字段可以考虑 |
| VARCHAR(20) | 按字符存储 | 20是字符数上限,不是字节数,适合姓名、编号等变长文本 |
| CHAR(20) | 固定20 |
