🐬 第2章 MySQL简介
📄 一句话概括

MySQL 是客户机-服务器软件: 你敲命令的那个程序(客户端)和真正存数据的程序(服务端 mysqld)不是一个, 中间靠 TCP 3306 说话。 Demo 打出这个沙箱的真话:没有 MySQL 服务端,只有 SQLite 3.53.1。 所以本课把「一条 SQL 要过四站」这件事拆开讲清楚,再逐条对照两种数据库的连接方式。

📝 本章和前面几章的关系

上一章认了词,这一章认产品。 教材成书于 MySQL 5.x 时代(约 2009 年),所以它讲的工具、版本号、 界面都和现在有距离——这一章会把这层时间差讲明白,免得你照着书去找一个早就下线的软件。 本章不讲 SQL,纯背景。 但它解释了一件后面天天遇到的事:为什么报错信息里会出现「连接」「端口」「服务」这些词。

一、什么是MySQL:两半,不是一半

MySQL 是一个数据库管理系统(DBMS),它的活是替你存数据、查数据。 它和别的软件最大的不同是:它由两个程序组成。 服务端(mysqld):常驻后台,真正管着磁盘上的数据文件。 它监听一个端口(MySQL 默认 3306),等别人来问。 客户端:你手上的那个程序——命令行 mysql、图形工具、或者一段 Python 代码里的连接库。 它负责把 SQL 发过去、把结果接回来。 所以「装 MySQL」严格说是装两样东西,而且它们可以在两台机器上:服务端在机房, 客户端在你笔记本上,中间走网络。这就是为什么 MySQL 天生能多人共用,而 SQLite 不行。 对照一下 SQLite:它没有服务端。库就是一个文件,你的程序直接打开这个文件读写。 好处是零配置、拷一个文件就搬走了;坏处是并发写会排队,也没法多台机器同时用。 一句话记住差别:MySQL 是「打电话点菜」,SQLite 是「自己开冰箱」。

二、版本:教材写的和今天的差了二十年

教材第 2 章讲的版本是 MySQL 4.1、5.0、5.1,还顺带提了 6.0(那个版本最终没有发布)。 这个时间点很重要——书上的安装步骤、默认配置、甚至某些 SQL 语法,都是那个年代的。 今天是 2026 年 10 月,MySQL 的版本线是这样: 8.4 LTS(长期支持,当前 8.4.13)、9.7 LTS(当前 9.7.4)、以及创新版 26.10.0。 从 26.7.0 起,创新版改用日历版本号 YY.M.P: 26 是 2026 年,7 是 7 月,0 是补丁号。LTS 仍用原来的编号(8.4、9.7)。 两条线的分工:LTS 只收安全与 bug 修复、支持周期长,适合生产; 创新版每季度一发、带新功能,适合能跟着升级的场景。选哪个不看新旧,看你能多久升一次。 教材里还有一句「MySQL 有社区版和商业版」——这句今天仍然成立:社区版(GPL)免费,企业版收费、 多监控与支持。书上的判断没过时,只是版本号换了。

三、工具:书里那两个已经没了

教材 2.2 节介绍了三个工具:mysql 命令行实用程序、MySQL Administrator、 MySQL Query Browser。 命令行那个还在,而且一直是主力。它的好处是:不依赖图形界面、能写成脚本、报错原文最完整。 服务器上没有图形界面,出问题时你只有它。 后两个已经停止维护了。它们的功能被 MySQL Workbench 接手——一个软件里同时有建模、SQL 编辑、 服务器管理三块。照着书去官网找 Administrator,是找不到的。这就是读老书必须留神的地方。 今天常用的还有一批第三方客户端(DBeaver、Navicat、DataGrip 之类),以及各语言自己的驱动。 它们都只是「客户端」这一侧的花样,底下发给服务端的还是同一句 SQL。 这给了一个很实用的结论:先把命令行用熟,图形工具随时换。SQL 是慢变量,界面是快变量。

四、小结

教材小结强调的是「MySQL 便宜、快、够用」——这三条今天依然成立,它仍然是 Web 后端最常见的选择之一。 本课再补三条:一是它是两半的软件(客户端 + 服务端),这句话能解释后面九成的环境问题; 二是版本号要按今天的情况理解(8.4 LTS/9.7 LTS/26.x 创新版),书上的 5.x 已经是历史; 三是图形工具会换、SQL 不会换。

五、动手 Demo:把「四站」和「两层的差别」摆出来

这段代码先打出这个沙箱真实的引擎版本(没有 MySQL,只有 SQLite), 再把一条 SQL 从敲下去到出结果经过的四站列成表, 最后逐条对照「同一件事在 MySQL 和 SQLite 里分别怎么写」。 两处都不是我编的:引擎版本是 sys 和 sqlite3 模块给的,端口 3306 是 MySQL 的默认值。

import sqlite3, sys

print("Python", sys.version.split()[0])
print("SQLite", sqlite3.sqlite_version)

# 客户机-服务器:MySQL 是两层,SQLite 是一层
#   mysql -h 主机 -u 用户 -p        <- 客户端连服务端
#   con = sqlite3.connect("x.db")   <- 直接开文件

实跑输出:

--------------------------------------------------------------------
第二课:MySQL 到底是什么
--------------------------------------------------------------------

  这个沙箱里能连上的数据库引擎是哪一个
  项目              值
  ----------------------------------------------------------
  Python 版本       3.13.14
  SQLite 引擎版本   3.53.1
  MySQL 服务端      没装,也装不了
  **所以本课所有 SQL 都跑在 SQLite 上,MySQL 独有的语法会单独标出来。**

  客户机-服务器:一条 SQL 从敲下去到出结果,经过几站
  站          谁在干                          打个比方
  ----------------------------------------------------------------------------------
  1 客户端    mysql 命令行/图形工具          点菜的服务员
  2 连接      TCP 3306(MySQL 默认端口)      服务员走向后厨的那道门
  3 服务端    mysqld 解析 SQL、查数据         后厨照着单子做菜
  4 回传      结果集按行返回                  菜端回桌上
  **MySQL 是「客户机-服务器」软件:你敲命令的那个程序和真正存数据的程序不是一个。**
  SQLite 把这两层压成了一层——库就是一个文件,没有服务端进程。

  所以「连上去」在两种数据库里长什么样
  动作          MySQL                         SQLite(本沙箱)
  ------------------------------------------------------------------------------
  连接          mysql -h 主机 -u 用户 -p      sqlite3.connect(文件)
  断开          exit 或 quit                  con.close()
  看有哪些库    SHOW DATABASES;               换一个文件
  选库          USE 库名;                     打开文件即选中
  多用户        支持,靠账号与权限            没有用户概念

  版本号里藏着的两件事
  MySQL 的版本号形如 8.0.36:**大版本.小版本.补丁**。
  大版本变了(5.7 到 8.0)通常有不兼容改动,小版本是加功能,补丁级只修 bug。
  本沙箱的 SQLite 3.53.1:**x.y.z 里 x 变了才有不兼容**。

第一张表先说清一件事:这个沙箱里能连上的数据库引擎只有 SQLite 3.53.1。 MySQL 服务端没装、 也装不了。所以本课所有 SQL 都在 SQLite 上真跑——这是事实,不是替代方案。 第二张表是这一章的核心。 四站:客户端、连接(TCP 3306)、服务端 mysqld、回传结果。 把这条链记住,以后看到「Can't connect to MySQL server」就知道断在第 2 站, 看到「Access denied」就知道断在第 3 站的权限检查,看到查询很慢就知道问题在第 3 站里。 第三张表是两种数据库的对照。 最要紧的一行是「多用户」:MySQL 靠账号和权限管人, SQLite 压根没有用户这个概念——因为库就是你硬盘上的一个文件,谁能读这个文件谁就是管理员。 最后一段讲版本号怎么读。 MySQL 是「大版本.小版本.补丁」, 大版本变才有不兼容(5.7 到 8.0 就踩过不少坑);SQLite 是 x.y.z,x 变才不兼容。 两种读法不一样,别套用。

30 秒实验

  1. 找一台能上网的机器,装 MySQL 8.4 LTS,然后敲 mysql --version,看你装的到底是哪一条线。
  2. 把 MySQL 默认端口改成 3307(配置文件里 port 一行),再连一次——不指定端口会怎样报错?
  3. SQLite 里 SELECT sqlite_version(); 打出什么?和 Python 里看到的版本号一致吗?

常见误区

  1. 以为「装了 MySQL」就等于「能连上」。装完还要服务在跑、端口在听、账号能登录。 三步里有一步没做,都是「连不上」。
  2. 照老教程装 5.x。书上的安装步骤是 2009 年的,今天下 8.4 或 9.7, 安装向导和默认认证方式都变了。版本要对上,步骤才对得上。
  3. 把客户端工具当数据库。Navicat 卸载了数据还在, mysqld 停了数据也还在——数据在磁盘的数据目录里,不在工具里。
自测三问(点开对答案) 1. MySQL 为什么叫「客户机-服务器」软件? —— 因为它由两个程序组成:服务端的 mysqld 管数据、监听 3306;客户端负责发 SQL 收结果。 两者可以在同一台机器,也可以在两台。 2. SQLite 和 MySQL 最本质的差别在哪一条? —— SQLite 没有服务端进程,库就是一个文件,程序直接读写; MySQL 有服务端,多人多程序通过网络共用同一份数据。 3. 教材提到的 MySQL Administrator 和 Query Browser 现在还能用吗? —— 不能,两个都已停止维护,功能并入了 MySQL Workbench。 命令行工具 mysql 还在,而且是排查问题的首选。

知道了它是两半的软件,下一步就是连上去:下一章讲连接、选库、 看表——这三件事是每次开工的前三十秒。

相关笔记