0. 先建立整体认知
登录 MySQL → 建库/选库 → 建表(列 + 类型 + 约束) → 改表 → 删表/删库
命令按操作对象分成三层,记住这个结构就不会乱:
|-----|----------|-----------------------------------------------------------------------------|
| 层级 | 操作对象 | 核心关键字 |
| 第一层 | 数据库(库) | CREATE DATABASE / DROP DATABASE / USE / SHOW DATABASES |
| 第二层 | 表结构(壳) | CREATE TABLE / DROP TABLE / ALTER TABLE / SHOW TABLES / DESC |
| 第三层 | 列的约束(规矩) | NOT NULL / DEFAULT / PRIMARY KEY / UNIQUE / FOREIGN KEY / CHECK |
一条铁律 :SQL 语句不区分大小写(建议关键字大写),但字符串常量区分大小写 ;每条语句必须以
;结尾。
1. 进门:登录与退出
# 1. 先启动服务(不启动会报 ERROR 2002 找不到 socket)
[root@server ~]# systemctl start mysqld
# 2. 登录(推荐:-p 后不写密码,回车后再输入,安全)
[root@server ~]# mysql -u root -p
# 3. 完整格式
mysql -u 用户名 -h 服务器主机地址 -p密码
参数拆解:
|------|---------------------------|------------------------------------|
| 参数 | 含义 | 注意 |
| -u | 用户名,如 root | |
| -h | 主机地址,本机写 localhost 或 IP | 本机可省略 |
| -p | 密码 | -p 与密码之间不能有空格,否则空格后的内容不会被当密码 |
明文写密码登录会警告:
Using a password on the command line interface can be insecure.
2. 数据库(库)操作
2.1 查看数据库
SHOW DATABASES; -- 注意有 s,查看所有库
SHOW DATABASES LIKE 'sys'; -- 按条件查看
SHOW DATABASES LIKE 's%'; -- % 匹配任意 0 个或多个字符
SHOW DATABASES LIKE '__sql'; -- _ 匹配任意单个字符 → 命中 mysql
自带的 4 个系统库,别乱动:
|----------------------|----------------------------|
| 库名 | 作用 |
| information_schema | 数据字典,存所有库/表/列/权限等元信息 |
| performance_schema | 服务器性能参数 |
| mysql | 用户、权限、帮助信息 |
| sys | 以视图方式把上面两个库包装成易读数据(5.7 新增) |
常用环境查看命令:
SELECT NOW(); -- 当前时间
SELECT VERSION(); -- 数据库版本
SELECT USER(); -- 当前登录用户及主机,如 root@localhost
SELECT DATABASE(); -- 当前正在使用的库,未选库时为 NULL
2.2 创建数据库
CREATE DATABASE testdb; -- 最简写法
CREATE DATABASE IF NOT EXISTS testdb; -- 不存在才建,不报错
CREATE DATABASE testdb CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci; -- 指定字符集
SHOW CREATE DATABASE testdb\G -- 回看建库语句(\G 竖排显示,防折行)
解读建库语句的输出:
CREATE DATABASE `testdb` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='N' */
testdb:反引号,防止与关键字冲突
utf8mb4:字符集,1~4 字节,支持 emoji
utf8mb4_0900_ai_ci:ai=不区分重音,ci=不区分大小写
ENCRYPTION='N':未加密
2.3 切换数据库
USE testdb; -- 切换(此句可不加分号)
SELECT DATABASE(); -- 确认当前库
建表前必须
USE 库名,否则报No database selected。
2.4 删除数据库
DROP DATABASE testdb;
删除前一定先备份,删库是不可逆操作。
3. 字符集与排序规则(建库必懂)
字符集 = 怎么存 ;字符序(COLLATION)= 怎么比大小、怎么排序。
SHOW CHARACTER SET; -- 查看所有支持的字符集
SHOW CHARACTER SET LIKE 'utf%'; -- 模糊查看
SHOW COLLATION; -- 查看所有字符序
SHOW VARIABLES LIKE 'character_set%'; -- 查看当前字符集设置
关键变量:
|----------------------------|------------|
| 变量 | 含义 |
| character_set_client | 客户端字符集 |
| character_set_connection | 通信链路字符集 |
| character_set_database | 数据库默认字符集 ★ |
| character_set_results | 返回结果的字符集 |
| character_set_server | 服务器默认字符集 ★ |
字符序命名后缀:
|-------------|--------------------------|
| 后缀 | 含义 |
| bin | 二进制比较 |
| ci | 大小写不敏感(case insensitive) |
| cs | 大小写敏感 |
| ai / as | 不区分 / 区分重音 |
| ks | 假名敏感 |
utf8 vs utf8mb4(重点):
- MySQL 的
utf8其实是utf8mb3,最长 3 字节,存不下 emoji、生僻汉字
utf8mb4= most bytes 4,是 utf8 的超集,8.0 默认,推荐一律用它
- 5.7 默认 latin1,8.0 默认 utf8mb4
4. 命名规范(生产环境习惯)
通用规则:
- 用有意义的英文词汇,中间以下划线分隔
- 只能由字母、数字、
#、_、$组成,必须以字母开头
- 不用 MySQL 保留字;统一小写
库: 项目名 + 库含义简写,不超过 30 字符,如 im_flow
表:
|-----|-----------------------|------------------------------|
| 类型 | 规则 | 示例 |
| 常规表 | t_ + 模块 + 表含义 | t_user_eduinfo |
| 临时表 | temp_ + 模块 + 表 + 日期 | temp_user_eduinfo_20240520 |
| 备份表 | bak_ + 模块 + 表 + 日期 | bak_user_eduinfo_20231219 |
5. 数据类型(建表的积木)
5.1 整型
|-------------|----|---------------------------|-----------------|
| 类型 | 字节 | 有符号范围 | 无符号范围 |
| TINYINT | 1 | -128 ~ 127 | 0 ~ 255 |
| SMALLINT | 2 | -32768 ~ 32767 | 0 ~ 65535 |
| MEDIUMINT | 3 | -8388608 ~ 8388607 | 0 ~ 16777215 |
| INT | 4 | -2147483648 ~ 2147483647 | 0 ~ 4294967295 |
| BIGINT | 8 | 很大 | 更大 |
只存 0/1 的枚举字段用
TINYINT就够,用BIGINT是浪费(100 万行白扔约 6.7MB)。int(10)里的 10 只是显示宽度 ,int 永远占 4 字节,8.0.17 后已不推荐该写法。 加UNSIGNED表示无符号(如age INT UNSIGNED)。
5.2 浮点型与定点型
|----------------|-----|---------------------|
| 类型 | 字节 | 说明 |
| FLOAT(M,D) | 4 | 单精度,存近似值 |
| DOUBLE(M,D) | 8 | 双精度,存近似值 |
| DECIMAL(M,D) | --- | 定点型,以字符串存,无精度丢失 |
5.3 文本型
|---------------------------|--------------------------------|
| 类型 | 说明 |
| CHAR(size) | 定长字符串,最多 255,不足补空格 → 适合手机号、身份证 |
| VARCHAR(size) | 变长字符串 → 长度不固定时用它 |
| TINYTEXT | 最大 255 字符 |
| TEXT | 最大 65,535 字符 |
| MEDIUMTEXT / LONGTEXT | 更大文本 |
| BLOB 系列 | 二进制大对象,无字符集和排序规则 |
| ENUM('x','y','z') | 枚举,最多 65535 个值 |
| SET | 可存多个值,最多 64 个列表项 |
BLOB二进制存储无排序规则;TEXT字符形式存储有字符集和排序规则,适合文章、评论。
5.4 日期时间型
|-------------|----|-----------------------------|
| 类型 | 字节 | 格式 |
| DATE | 3 | yyyy-MM-dd |
| TIME | 3 | HH:mm:ss |
| YEAR | 1 | yyyy |
| DATETIME | 8 | yyyy-MM-dd HH:mm:ss |
| TIMESTAMP | 4 | yyyy-MM-dd HH:mm:ss,可作时间戳 |