登录与库表结构
MySQL 登录选项 -u/-p/-h/-P、退出方式;库表行列结构、常用数据类型、char 与 varchar、utf8mb4 与乱码。
本页目录
装好 MySQL 之后,先别急着建表。今天把两件「地图级」的事打牢:
- 登录命令怎么读——每个选项是什么意思
- 库里到底怎么放数据——库、表、行、列,以及列的「类型」
系列:MySQL 入门到查询 · 第 3 / 17 篇(第 3 天 · 4 月 23 日)
上一篇:Windows 安装 MySQL
下一篇:创建库和表
总目录:系列索引
环境说明
- 系统:Windows + MySQL 8.0(已按第 2 天装好并配置 Path)
- 你会用到:cmd、
mysql>提示符 - 预计:读 25 分钟 + 练习 20 分钟
- 练习库:本篇偏概念;命令跟做请从下一篇起 use train;(系列统一练习库名)
1. 登录:把命令拆开看
1.1 完整语法
mysql -u用户名 -p密码 -h目标主机IP -P端口号
| 选项 | 英文 | 含义 |
|---|---|---|
-u | username | 用户名(如 root) |
-p | password | 密码 |
-h | host | 目标主机的 IP / 主机名 |
-P(大写) | port | MySQL 端口号 |
易错:
-p是小写、-P是大写,含义不同。
1.2 口诀:什么时候可以省略
| 选项 | 能否省略 | 条件 |
|---|---|---|
-u | 必须写 | — |
-p | 必须写 | 密码可在回车后再输入 |
-h | 登录本机可省 | 登录别的电脑必须写 IP |
-P | 没改过端口可省 | 改过端口必须写 |
本机登录(最常用):
mysql -uroot -p
回车后再输入密码(屏幕可能不显示 *,属正常)。
也可以把密码写在 -p 后面(无空格):
mysql -uroot -pYourPass123
注意:
-p后面不要加空格再写密码;另外这种方式可能被记入命令历史,学习环境可用,生产环境更推荐回车后输入。
登录远程 MySQL(示意):
mysql -uroot -p -h 192.168.1.10
指定了非默认端口时:
mysql -uroot -p -h 192.168.1.10 -P 3307
1.3 IP 与端口(用门牌号理解)
互联网 / 局域网
│
▼
主机 192.168.1.10 ← 这栋楼在哪里
│
▼
端口 3306 ← 楼里哪一户(MySQL)
- IP:在网络中定位一台计算机
- 端口:在一台计算机上定位某个联网程序
- MySQL 默认 3306;安装时若未修改,
-P可以不写
1.4 退出登录(三选一)
在 mysql> 提示符下:
quit
exit
\q
退出后回到 Windows 的 C:\...> 提示符。
1.5 登录后可以先跑的几句话
以下都是 SQL,结尾分号 ; 表示「这句话说完了」:
select version();
查看 MySQL 版本。
select user();
查看当前登录的用户信息。
select database();
查看「现在选中了哪个库」。刚登录时若显示 NULL,说明还没 USE 某个库——建库之后第 4 天会用到。
show databases;
查看当前服务器上有哪些库(列表因安装环境而异)。
小白提示:
mysql>后打字,输错可用退格改;一定等看到;再回车执行。
2. MySQL 里的「文件夹」:库表行列
2.1 四层结构(必背)
库(database) —— 像文件夹:一组相关的表
└── 表(table) —— 像表文件:某类数据的集合
└── 行(row) —— 一条记录(record)
└── 列(column) —— 记录里的一个属性(field)
| 层级 | 英文常见叫法 | 生活比喻 |
|---|---|---|
| 库 | database / schema | 一个 Excel 工作簿文件夹 |
| 表 | table | 一张 Excel 工作表 |
| 行 | row / record | 表里的一行(一个订单/一个学生) |
| 列 | column / field | 表头(姓名、金额…) |
例子:电商库 shop
| 表名 | 一行是什么 | 可能的列 |
|---|---|---|
users | 一个注册用户 | id、用户名、手机号 |
goods | 一个商品 | id、名称、价格、库存 |
orders | 一个订单 | id、用户id、商品id、数量、下单时间 |
2.2 为什么叫「结构化」
因为建表时就约定好:
- 有哪些列
- 每列叫什么(列名)
- 每列能存什么(数据类型)
这样程序和人读同一张表时,知道「第二列一定是价格」,而不是每行格式都不一样。
2.3 列名怎么取
约定:
- 见名知意:英文单词、组合,少量拼音也可
- 多单词用下划线
_分隔 - 不建议用中文做列名(工具、编码、协作容易出问题)
| 想表达 | 推荐列名(示例) |
|---|---|
| 学生姓名 | name / stu_name / sname |
| 商品价格 | price / goods_price |
| 创建时间 | create_time / ctime |
2.4 一张表在脑子里长什么样
假设表 stu:
| id | name | age |
|---|---|---|
| 1 | 张三 | 18 |
| 2 | 李四 | 20 |
- 3 个列:
id、name、age - 2 个行(2 条记录)
- 每一行都必须按同样的列结构存放
3. 数据类型:列能「装」什么
建表时,每一列都要指定类型,相当于给抽屉贴标签:「这里放整数」「这里放文字」。
3.1 常用类型速览
| 分类 | 类型 | 说明 |
|---|---|---|
| 整数 | int | 1、2、18、2026… |
| 小数 | double | 3.14、99.9… |
| 文字 | char(n) / varchar(n) | 括号里是最多几个字符 |
| 日期时间 | datetime | 年-月-日 时:分:秒 |
| 仅日期 | date | 年-月-日 |
| 仅时间 | time | 时:分:秒 |
3.2 两条使用规则(考试/实操都爱问)
- 只有字符类型建表时要在括号里写最大字符数,例如
varchar(20);其他类型一般不写个数。 - 写数据时:字符、日期时间用英文单引号包起来(推荐 '张三';双引号在 ANSI_QUOTES 等场景可能被当成标识符);整数、小数直接写。
-- 示意(第 4 天才会完整建表)
-- name 用字符,要加引号;age 是 int,不加引号
-- '张三' / 18
| 列类型 | 插入时写法示例 |
|---|---|
varchar | '张三'、"iPhone" |
datetime | '2026-04-23 18:30:00' |
int | 18 |
double | 99.5 |
4. 面试高频:char 和 varchar
| 类型 | 含义 | 空间怎么算 | 适合 |
|---|---|---|---|
char(n) | 定长 | 不管实际多少字,都按 n 个字符的位置预留 | 长度几乎固定:如性别 char(1)、邮编 |
varchar(n) | 变长 | 按实际使用的字符数申请(上限 n) | 长度变化大:姓名、地址、标题 |
用「张三」举例
姓名列设置为最多 10 个字符:
| 写法 | 实际存了 | 大约按多少申请空间 |
|---|---|---|
char(10) | 张三(2 字) | 仍按 10 个字符的位置 |
varchar(10) | 张三(2 字) | 约按 2 个字符(更省空间) |
char(10) [张三][空位][空位]... ← 槽位固定
varchar(10) [张三] ← 用多少占多少(上限 10)
面试答法:
char定长、读写简单、可能浪费空间;varchar变长、更省空间;具体性能还与版本、引擎、是否常改长度有关,入门阶段记住「定长 vs 变长」即可。
5. 文字编码:为什么会出现乱码
5.1 用密码本理解
计算机底层是 0 和 1。「张」这个字,用不同编码规则,对应不同的字节序列。
| 编码 | 特点(入门级) |
|---|---|
utf-8 / MySQL 里的 utf8mb4 | 国际通用;中文常见占 3~4 字节 |
gbk | 国内常见;中文常见占 2 字节 |
- 编码:字 → 按规则变成字节
- 解码:字节 → 按规则还原成字
- 两边规则不一致 → 乱码
5.2 MySQL 里怎么选
| 场景 | 建议 |
|---|---|
| 新项目、要表情/生僻字、与 Java/Python 对接 | 库/表编码用 utf8mb4 |
| 旧系统明确使用 gbk | 按旧系统对齐 |
实务:程序代码用
utf-8时,MySQL 侧优先utf8mb4(MySQL 里早年还有叫utf8的类型,却不是完整 4 字节 UTF-8;新项目直接选utf8mb4更省心)。
5.3 查看支持的编码与当前变量(了解)
show charset;
会列出 MySQL 支持的字符集(如 gbk、utf8mb4 及其默认校验规则、最大字节数等)。
show variables like '%character%';
查看与字符相关的系统变量;若某项是 utf8mb4,表示当前会话/库等按该编码处理(具体含义后面建库时再细抠)。
5.4 库表编码的继承规则(先记结论)
建库:不指定编码 → 用 MySQL 默认;指定了 → 用你指定的
建表:不指定编码 → 继承库;指定了 → 用你指定的
改库编码:不会自动改掉「已经建好的表」
改表编码:不会自动改掉每一列,可能要再改列(进阶,第 5 天附近)
6. 存储引擎(先认识即可)
存储引擎 = MySQL 把数据存到磁盘上的不同方式。
| 引擎 | 是否默认 | 事务 | 特点(笔记口径) |
|---|---|---|---|
| InnoDB | 是(MySQL 8) | 支持 | 更强调数据安全与完整;数据+索引常见 .ibd |
| MyISAM | 否 | 不支持 | 历史引擎;查询可能更快;数据/索引/元数据分成多个文件 |
选择直觉:
- 数据经常变、要可靠(订单、库存)→ InnoDB
- 数据很少变、要快查(省市区字典表)→ 旧系统可能用 MyISAM
入门建议:新表默认 InnoDB 即可,不必纠结。本系列练习也不强制切换引擎。
7. SELECT 和 WHERE 的分工(预告)
后面写查询时,两句关键词分工是:
| 关键词 | 管什么 | 记忆 |
|---|---|---|
SELECT | 选列(显示哪些字段) | * 表示所有列 |
WHERE | 选行(只保留满足条件的记录) | 条件成立才留下 |
-- 示意:只要 age 列,且只要 age>=18 的行
-- select age from 表名 where age>=18;
条件里常用比较:> < >= <= = !=(或 <>)。入门推荐用 != 表示不等于。
8. 今天练习(约 20 分钟)
A. 登录与退出
mysql -uroot -p
在 mysql> 中依次执行(注意分号):
select version();
select user();
select database();
show databases;
show charset;
然后:
\q
B. 纸上设计
设计 school.students 表:
| 列名 | 类型 | 说明 |
|---|---|---|
| id | int | 编号 |
| name | varchar(20) | 姓名 |
| gender | char(1) | 性别,如 M/F |
| birth | date | 出生日期 |
| score | double | 入学成绩 |
回答:
- 若
name用char(20),存「欧阳娜娜」三个字,空间上和varchar(20)有什么差别? birth写成'2026-04-23'还是2026-04-23?为什么?- 库和表分别对应你电脑上什么概念?
参考要点
char(20)按 20 字符预留,更浪费;varchar(20)更省。- 要加引号:
'2026-04-23',因为是日期/字符类。 - 库 ≈ 文件夹,表 ≈ 文件夹里的表文件(由 MySQL 管理)。
速查表
| 目标 | 写法 / 概念 |
|---|---|
| 本机登录 | mysql -uroot -p |
| 远程登录 | mysql -u用户 -p -h IP |
| 指定端口 | -P 端口(默认 3306 可省) |
| 退出 | quit / exit / \q |
| 版本/用户/当前库 | select version(); select user(); select database(); |
| 看库 | show databases; |
| 结构 | 库 → 表 → 行 → 列 |
| 字符类型 | char(n) 定长 / varchar(n) 变长 |
| 日期类 | datetime / date / time,数据加引号 |
| 编码 | 新项目优先 utf8mb4 |
常见错误
易错:
-P与-p混用;大写才是端口。
易错:SQL 语句末尾忘了;,提示符变成->。
易错:对int列写成'18'虽有时能隐式转换,但习惯上整数不加引号;日期时间要加。
易错:用中文列名、表名,后续编码和工具兼容性差。
易错:以为char一定更快、varchar一定更慢——入门记定长/变长与空间即可。
小结
- 登录核心:
-u用户、-p密码、-h主机、-P端口;本机默认端口可只用mysql -uroot -p。 - 数据放在 库 → 表 → 行 → 列 四层结构里。
- 列 = 列名 + 数据类型;
char定长,varchar变长。 - 新项目编码优先
utf8mb4,避免乱码。 - 下一篇真正动手:
CREATE DATABASE/CREATE TABLE,把今天设计的表建出来。
系列导航:总目录 · 上一篇:Windows 安装 MySQL · 下一篇:创建库和表