MySQL

登录与库表结构

MySQL 登录选项 -u/-p/-h/-P、退出方式;库表行列结构、常用数据类型、char 与 varchar、utf8mb4 与乱码。

装好 MySQL 之后,先别急着建表。今天把两件「地图级」的事打牢:

  1. 登录命令怎么读——每个选项是什么意思
  2. 库里到底怎么放数据——库、表、行、列,以及列的「类型」

系列: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端口号
选项英文含义
-uusername用户名(如 root)
-ppassword密码
-hhost目标主机的 IP / 主机名
-P(大写)portMySQL 端口号

易错:-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 列名怎么取

约定:

  1. 见名知意:英文单词、组合,少量拼音也可
  2. 多单词用下划线 _ 分隔
  3. 不建议用中文做列名(工具、编码、协作容易出问题)
想表达推荐列名(示例)
学生姓名name / stu_name / sname
商品价格price / goods_price
创建时间create_time / ctime

2.4 一张表在脑子里长什么样

假设表 stu:

idnameage
1张三18
2李四20
  • 3 个列:id、name、age
  • 2 个行(2 条记录)
  • 每一行都必须按同样的列结构存放

3. 数据类型:列能「装」什么

建表时,每一列都要指定类型,相当于给抽屉贴标签:「这里放整数」「这里放文字」。

3.1 常用类型速览

分类类型说明
整数int1、2、18、2026…
小数double3.14、99.9…
文字char(n) / varchar(n)括号里是最多几个字符
日期时间datetime年-月-日 时:分:秒
仅日期date年-月-日
仅时间time时:分:秒

3.2 两条使用规则(考试/实操都爱问)

  1. 只有字符类型建表时要在括号里写最大字符数,例如 varchar(20);其他类型一般不写个数。
  2. 写数据时:字符、日期时间用英文单引号包起来(推荐 '张三';双引号在 ANSI_QUOTES 等场景可能被当成标识符);整数、小数直接写。
-- 示意(第 4 天才会完整建表)
-- name 用字符,要加引号;age 是 int,不加引号
-- '张三'  /  18
列类型插入时写法示例
varchar'张三'、"iPhone"
datetime'2026-04-23 18:30:00'
int18
double99.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 表:

列名类型说明
idint编号
namevarchar(20)姓名
genderchar(1)性别,如 M/F
birthdate出生日期
scoredouble入学成绩

回答:

  1. 若 name 用 char(20),存「欧阳娜娜」三个字,空间上和 varchar(20) 有什么差别?
  2. birth 写成 '2026-04-23' 还是 2026-04-23?为什么?
  3. 库和表分别对应你电脑上什么概念?

参考要点

  1. char(20) 按 20 字符预留,更浪费;varchar(20) 更省。
  2. 要加引号:'2026-04-23',因为是日期/字符类。
  3. 库 ≈ 文件夹,表 ≈ 文件夹里的表文件(由 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 一定更慢——入门记定长/变长与空间即可。

小结

  1. 登录核心:-u 用户、-p 密码、-h 主机、-P 端口;本机默认端口可只用 mysql -uroot -p。
  2. 数据放在 库 → 表 → 行 → 列 四层结构里。
  3. 列 = 列名 + 数据类型;char 定长,varchar 变长。
  4. 新项目编码优先 utf8mb4,避免乱码。
  5. 下一篇真正动手:CREATE DATABASE / CREATE TABLE,把今天设计的表建出来。

系列导航:总目录 · 上一篇:Windows 安装 MySQL · 下一篇:创建库和表

相关阅读

全部文章 →
← 返回列表更多「MySQL」