MySQL 上手:库与表的操作、编码校验集与备份还原
我的github:(https://github.com/xcx55/ubuntu-linux-project)
感谢各位大佬参观我的github!!
源笔记:mysql库操作1(26-9-18)、MySQL表的操作(26-9-19)
上一篇把 MySQL 的真面目看清了:mysqld 守护进程 + mysql 客户端,DB=目录、表=文件。这一篇正式上手------先学三个库指令,再学建表改表,最后把"编码集/校验集"这个最容易踩的坑和备份还原一起解决。
一、库操作:三个指令打天下
围绕数据库(注意:是 database,不是表文件),常用的就三个动作:看库、建库、删库:
sql
show databases; -- 看有哪些数据库
create database xxx; -- 创建数据库(本质:创建文件夹,上层封装了 API)
alter database xxx ...; -- 修改数据库
drop database xxx; -- 删除数据库(本质:删目录)
记住上一篇的结论就不难理解这些指令:数据库的本质就是文件夹 ,所以"对库的操作"翻译成 Linux 就是 mkdir/ls/rm------只是 mysqld 替你干了,还顺手做了权限、记录、并发管理。
use:进入数据库的"cd"
对一个数据库建表之前,必须先 use 数据库名字------相当于 cd 进目录。 数据库是文件夹,建表就是在文件夹里建文件,你得先"进"这个文件夹。
二、编码集与校验集:存和取必须是同一套
建库时最容易被忽略、又最容易出事的一对概念:
- 编码集 :决定数据以什么编码存入;
- 校验集 :决定数据以什么编码取出/比较。
为什么要有两个标准?两个用处:
- 存储数据一样------存进去什么样,得原样取出来;
- 后面支持字段比较------比较字符串时,得用同样的函数方法比较。
所以铁律来了:
要是存的编码和取(校验)的编码不一样,就会导致识别读取的区别! 存进去是 UTF-8、按 GBK 校验取出来,中文立刻变成乱码。
存入用什么编码,取出就得用同一套------这是建库时就该定好的事,别等表里灌了几万行数据再改。
三、删库之前:先聊聊备份
drop database 是最痛快也最危险的指令。删库之前怎么备份?
为什么不用 cp 直接把文件拷走? 可以,但有更好的选择------mysqldump:
bash
mysqldump -u root -p -B 数据库名 > 备份文件.sql
它比裸 cp 强在两点:
- 不仅拷贝了数据 ,还把这个数据库的操作指令也记录了(建库建表的完整 SQL 都在备份里);
-B参数的妙用:恢复指令里自带create database xxx,主动创建库------不用你先手动建好空库再灌数据。
恢复也简单:
- 备份:在 Linux 命令行里做(mysqldump 是外部工具);
- 恢复:在 mysql 命令行 里
source + 绝对路径------备份文件里的 SQL 逐条执行,库就回来了。
四、建表:建立的是表的"格式"
sql
create table if not exists user1(
id int comment '机器查找需要',
name varchar(32) comment '人看的注释',
birthday date comment '出生日期'
);
几个要点:
if not exists:存在就不再建,脚本可以反复执行;comment是注释 :写给"人"看的说明。注意字段语义的分工------id 是机器查找需要的,注释是给人看的;- date 在 MySQL 里是一种类型!生日、注册日这类"年月日"不用自己拼字符串,直接有原生类型(还有 datetime、timestamp 一族)。
表结构、存储引擎与索引
建表时会发现同样的建表语句,表结构(底层文件布局)可能不一样 ------这和存储引擎有关:
表结构 ------ 存储引擎 ------ 索引
选哪个引擎(InnoDB/MyISAM),决定了数据在文件里怎么组织、索引怎么建。插件式引擎就像上一篇说的"插件类似一个类",new 出来就能换。
建立表,本质是建立表的格式(列名、类型、注释、引擎)------先有格式,再往里灌数据。
五、查看与修改表
查看表结构
三连:先 use 进库 → show tables; 看有哪些表 → desc 表名; 看表的格式(每列的类型、键、默认值一目了然)。
修改表:一切从 alter table 开始
前提语法:alter table 表名 ... 表示"我要改你这张表的结构(属性和属性类型)了"------和"改表里的数据"完全是两码事。
sql
-- 新增一列,还可以指定插到哪一列后面
alter table user add image_path varchar(128) comment '头像路径' after birthday;
-- 修改属性类型(modify 中文也是"修改")
alter table user modify name varchar(64);
-- 修改属性名字
alter table user change name username varchar(32);
-- 改表名 / 删表
alter table user rename to user1;
drop table user1;
一条重要的工程原则
一般不要修改和删除表!要改就增加!
为什么?表结构一动,依赖这张表的代码、SQL、备份全都要跟着动;而加列是向后兼容的,老代码照跑。所以:
- 增删查改(zscg)这个词,默认是针对"表文件里面的数据"说的------业务天天做;
- 对"表结构"的增删查改,走
alter table------能不做就不做,做了要慎重。
总结
- 库三连:show/create/drop database,本质就是文件夹操作;use = cd,建表前必做;
- 编码集管存、校验集管取和比较,两套必须一致,否则乱码;
- 备份用 mysqldump -B (数据+建库语句全记录),cp 裸拷做不到;恢复在 mysql 里 source 绝对路径;
- 建表建的是格式 :comment 给人看、id 给机器用、date 是原生类型;表结构-存储引擎-索引一条线;
- 查结构三连 use → show → desc;改结构一切从 alter table 开始,add/modify/change 分工不同;
- 原则:对数据随便 CRUD,对表结构能加不改不删。
下一篇回到网络线:UDP 报文在内核里到底长什么样、sk_buff 怎么用一根指针玩转封装解包------以及网络服务为什么必须"守护进程化"才能活。