简介:《MySQL安装及使用教程》面向零基础数据库初学者与需要快速搭建本地环境的开发者,围绕 MySQL 下载安装、环境变量配置、服务启停及 Workbench 图形化管理展开,帮助读者解决入门阶段安装配置和基本操作不熟悉的问题。压缩包内仅含 1 个 docx 文档,约 1.53MB,以图文步骤组织内容,便于按章节查阅和跟练。文档详细梳理 Windows 平台安装包的获取与安装流程,并给出连接测试、建库建表、数据写入等操作示例,同时覆盖 select、insert、update、delete 四类基础 SQL 的写法与注意事项。已有 1456 人学习,适合用作课程实验、自学入门或日常查阅的轻量参考资料。
1. 装完 MySQL 只是起点:能连上、能建表、能改数据才算数
装 MySQL 最容易让人产生错觉的时刻,是安装器一路 Next 走完、界面提示配置成功的那一下。服务确实起来了,可真到要用的时候,命令行敲mysql提示“不是内部或外部命令”,net start mysql80报“服务名无效”,往表里插一条中文又变成问号。
这份 MySQL 安装及使用教程真正有价值的部分,不是把下载页点一遍,而是把“下载安装 → 配 PATH → 起服务 → 建库建表 → 增删改查”串成了一条能照着走的线。它适合第一次在 Windows 上落地 MySQL 8.0 的人,也适合装了卸、卸了装好几轮还没搞清服务名和端口关系的人。下面按我复现的顺序重排一遍,原文一句带过、实际最卡人的地方补上参数和判断。
2. 安装包与组件的取舍:我为什么只勾 Server 和 Workbench
2.1 在线包和离线包,选错了会卡在下载那一格
下载页拉到最底部,通常会看到两个安装包:一个体积很小、名字里带 web;另一个体积大、名字里带 community。web 包本质是个引导器,安装过程中再去服务器拉组件,网络一抖就卡在 Downloading 那一格,重试几次心态就崩了;community 离线包把所有组件都打进来了,装一次不用再联网。
我给同事装机一律推离线包,尤其是内网环境或者网络时好时坏的时候。省下来的那点流量,换不来一次安装失败重来的时间。这是第一个选型判断:能不能一次装完,比安装包小几百兆重要得多。
第二个判断在组件勾选那一页。安装器给的几个预设里,Developer Default 看着最全,会把 Server、Workbench、Shell、各种 Connector、示例库、Excel 插件一股脑装进去。第一次装的人容易觉得“全总比少好”,装完才发现多出好几个用不上的东西,卸载时还得一个个认。我一般选 Custom,只勾两项:
| 组件 | 是否勾选 | 理由 |
|---|---|---|
| MySQL Server 8.0 | 必勾 | 真正的数据库服务端,没有它后面全是空谈 |
| MySQL Workbench | 必勾 | 图形化建库建表,新手过渡期很省事 |
| MySQL Shell | 可选 | 习惯命令行的人再加,图形界面够用可以先不装 |
| Connectors(ODBC/JDBC 等) | 按需 | 等真有程序要连了再补,装了不用只是占地方 |
| 示例库与示例数据 | 不勾 | 学习阶段用不上,还会多出一堆陌生库名干扰 |
下载完先别急着双击。安装包从浏览器下来,中途断流或者被安全软件改过的概率不低,花十秒校验一下哈希,比装到一半报错强:
# 在安装包所在目录打开 PowerShell,自动匹配下载到的 community 包 $pkg = Get-ChildItem -Filter 'mysql-installer-community-*.msi' | Select-Object -First 1 # 算 SHA256,和下载页给出的校验值逐位对一遍 Get-FileHash -Algorithm SHA256 -Path $pkg.FullName这段脚本做两件事:先用通配符找到实际下载到的那个 msi(避免手打版本号打错),再输出 SHA256。参数-Algorithm SHA256指定摘要算法,-Path接完整路径。两串字符对不上就别装了,重新下一遍,装到一半失败的排查成本远高于重下。
2.2 认证方式那一页,别闭着眼睛点 Next
安装过程里有一页会被很多人忽略:Authentication Method。它会让你在“强密码加密”和“旧版认证方式”之间二选一。
MySQL 8.0 默认用caching_sha2_password,安全性更好,但一些老版本的驱动、老客户端、老 ORM 框架不认这个插件,连上来直接抛Authentication plugin 'caching_sha2_password' cannot be loaded。这时候有两条路:一是安装时就选旧版兼容模式,二是先按默认装完,等真遇到哪个客户端不兼容,再单独给那个账号改插件。
我选后者。整库降级去迁就一个老驱动,等于把安全边界拉到最低,后面想再拉回来还要改一堆账号。默认走强加密,兼容问题按账号单独处理,这是我在多台机器上踩过之后固定下来的做法。
同一页往下走,还要设 root 密码、确认服务名和端口。默认服务名是 MySQL80,端口 3306,勾选“作为 Windows 服务启动”和“开机自启”。这三项后面会反复用到:服务名决定你用net start敲什么,端口决定连接填什么,自启决定重启机器后要不要手动拉一次。
密码这一项值得多说一句。安装器如果带上密码强度组件,弱密码会直接被拦下来,报ERROR 1819。别想着绕过去,设一个大小写加数字加符号、长度十二位以上的密码,记在密码管理器里,比后面为了图省事去改密码策略划算得多。
2.3 安装完成后的第一轮自检
安装器提示完成后,不要直接去开 Workbench。先在管理员权限的命令行里跑三条命令,把服务层、网络层、登录层各验证一遍:
# 1. 查服务状态,RUNNING 才算起来了;服务名按你安装时填的来 sc query mysql80 # 2. 看 3306 有没有在监听,LISTENING 说明端口通了 netstat -ano | findstr :3306 # 3. 真正登录一次,顺手把版本、端口、服务端字符集打出来 mysql -uroot -p -e "select version(), @@port, @@character_set_server;"第一条sc query里的服务名是安装时那一步填的,默认 MySQL80,填了别的就得换成别的。第二条netstat -ano输出里的最后一列是进程 PID,端口被别的程序占了也能从这里看出来。第三条-e参数表示“执行完这条 SQL 就退出”,不用进交互界面,适合做一次性自检;-u后面跟用户名,-p单独写表示交互式输入密码,别把密码直接跟在-p后面,那样会留在命令历史里。
三条都过,说明这份教程里最基础的一段已经落地了。任何一条不过,问题一定在安装或服务配置阶段,别急着去建库,先回第 5 章对号入座。
3. 服务、PATH 与登录入口:把 mysql80 变成随手可用的命令
3.1 PATH 里放的到底是哪个目录
安装器通常会自动把 bin 目录写进系统环境变量,但“通常”这两个字在真实机器上不太靠得住。判断方法很简单:新开一个命令行窗口,敲mysql --version,能出版本号就是配好了,提示“不是内部或外部命令”就是没配或者配错了。
要加的路径是安装目录下的 bin,原文给的写法是C:\Program Files\MySQL\MySQL Server 8.0\bin。为什么是 bin 而不是根目录:mysql.exe、mysqldump.exe、mysqladmin.exe这些可执行文件全在里面,PATH 只认“能直接找到 exe 的目录”,指到上一层是找不到的。
图形界面里改 PATH 容易手滑,追加时少了分号、把原有内容覆盖掉,都是血泪经验。用 PowerShell 改更稳,而且可以先判重,避免同一条路径被追加好几遍:
# 目标 bin 目录,按实际安装路径改 $bin = 'C:\Program Files\MySQL\MySQL Server 8.0\bin' # 读出当前机器级 PATH $old = [Environment]::GetEnvironmentVariable('Path', 'Machine') # 只有不存在时才追加,避免重复写入撑长变量 if ($old -notlike "*$bin*") { [Environment]::SetEnvironmentVariable('Path', "$old;$bin", 'Machine') Write-Output "已追加: $bin" } else { Write-Output "已存在,跳过: $bin" }SetEnvironmentVariable的第三个参数'Machine'表示写系统级而不是当前用户级,这样所有账户都能用;-notlike "*$bin*"是一次子串匹配,用来判重。改完之后有一个必踩的坑:已经开着的命令行窗口读的还是启动时那份环境变量,必须关掉重开,mysql --version才会生效。很多人改完在原地反复敲命令,以为没配上,其实只是窗口没刷新。
3.2 服务名不是想当然:net start 与 sc query 配合用
net start mysql80报“服务名无效”,十有八九是两个原因:一是安装时没勾“作为 Windows 服务启动”,二是服务名根本不叫 mysql80。
先查再启,别猜:
# 列出所有服务里名字带 mysql 的,服务名和显示名都会打出来 sc query type= service state= all | findstr /i "mysql" # 查到你真实的那个名字之后,再启停 net start mysql80 net stop mysql80sc query后面type= service这个等号两边都有空格,这是这个命令的语法要求,少一个空格就报参数错误,属于那种不看文档想不到的细节。state= all表示连没在运行的服务也列出来,findstr /i忽略大小写过滤。
如果查出来一个 mysql 相关的服务都没有,说明装的时候服务那一步被跳过了。补救办法是手动注册,前提是你知道安装目录和配置文件位置:
# 用 mysqld 手动注册服务,--defaults-file 指向安装目录下的 my.ini mysqld --install MySQL80 --defaults-file="C:\ProgramData\MySQL\MySQL Server 8.0\my.ini" # 注册完再启动 net start MySQL80--install后面跟的是服务名,可以自己起,但建议保持 MySQL80 这种带版本号的命名,将来装了第二个实例不会打架。--defaults-file必须写绝对路径,而且等号两边不能有空格。这两条命令都要在管理员权限下执行,普通权限会报拒绝访问。
3.3 从 mysql -uroot -p 到看见自己的库
服务通了、PATH 通了,接下来是登录。登录命令本身很短,参数值得说清楚:
# 完整写法:主机、端口、用户、字符集都显式指定 mysql -h 127.0.0.1 -P 3306 -uroot -p --default-character-set=utf8mb4 # 日常最简写法,本机默认端口可以省掉 -h 和 -P mysql -uroot -p-h是主机,本机可以写localhost也可以写127.0.0.1,两者在连接方式上有细微差别(一个走命名管道或共享内存,一个走 TCP),排查连接问题时建议统一用127.0.0.1,行为更可预期。-P是大写,指端口;小写-p是密码提示,这两个别搞混,搞混了会得到一句莫名其妙的报错。--default-character-set=utf8mb4是给当前会话定字符集,中文乱码的第一道防线。
登进去之后,先把库和表看一遍:
-- 列出这台实例上所有库,刚建的那个应该在里面 SHOW DATABASES; -- 切到目标库,后面的语句都作用在它上面 USE db_2; -- 看这个库里有哪些表 SHOW TABLES; -- 看某张表的建表语句,字符集、引擎、索引一目了然 SHOW CREATE TABLE student;SHOW CREATE TABLE是我建议每个新手都养成习惯的一条命令。它把表结构、存储引擎、字符集、索引原样吐出来,比在图形界面里点来点去看字段靠谱得多。特别是字符集,如果这里显示的是latin1而不是utf8mb4,那插入中文变问号就是必然的,跟你敲的 SQL 没关系。
4. Workbench 建库建表:从空连接走到 student 表的增删改查
4.1 新建连接的三个必填项,和 test connection 到底测了什么
打开 Workbench,首页那个加号就是新建连接。要填的字段不多,但每一项都有实际含义:
| 字段 | 建议值 | 说明 |
|---|---|---|
| Connection Name | 自定义,如 local-3306 | 只是显示名,方便区分多个实例 |
| Hostname | 127.0.0.1 | 本机连本机,用回环地址最稳 |
| Port | 3306 | 和安装时设的端口保持一致 |
| Username | root | 首次配置用 root,后面再建业务账号 |
| Password | 点 Store in Vault 保存 | 不保存的话每次连都要重输 |
填完先点 Test Connection。这一步测的是“网络能不能到 + 账号密码对不对”,不测权限。也就是说 test 通过只代表你能登进去,不代表你有建库的权限。test 失败的话,先回头看第 2 章那三条自检命令,服务没起或者端口不对,在这里怎么试都是白试。
test 通过后点 OK 保存,双击连接进入操作界面。左侧是导航栏,能看到已有的库和表;中间是 SQL 编辑区;下面是结果网格。原文里说的“点击红色区域”的那些位置,对应过来就是导航栏的 schema 列表和工具栏的建库按钮。
4.2 建库建表:字段类型、主键和字符集怎么定
图形界面点几下确实能建库,但点出来的东西不带注释、字符集靠默认值,换个环境就复现不了。我习惯在 Workbench 的 SQL 编辑区里直接写语句,点闪电图标执行,效果一样,而且这段 SQL 能存下来、能给别人、能进版本库。
建库这一步,字符集必须显式写:
-- 建库时就把字符集和排序规则定死,别依赖服务端默认值 CREATE DATABASE IF NOT EXISTS db_2 DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_0900_ai_ci; -- 切过去 USE db_2;utf8mb4和utf8不是一个东西,前者才是真正完整的四字节 UTF-8,能存表情符号和生僻字;后者在 MySQL 里是三个字节的老实现,存四字节字符会直接报错或者截断。utf8mb4_0900_ai_ci是 8.0 的默认排序规则,ai表示重音不敏感,ci表示大小写不敏感。没有特殊排序需求就用它。
建表这一步,原文给的字段是 idstudent、name、age、addr 四个。照着建没问题,但我会补三样东西:自增主键、字段注释、以及一个普通索引:
CREATE TABLE IF NOT EXISTS student ( idstudent INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键,自增', name VARCHAR(32) NOT NULL COMMENT '姓名', age TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '年龄', addr VARCHAR(120) NOT NULL DEFAULT '' COMMENT '地址', PRIMARY KEY (idstudent), KEY idx_name (name) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='学生信息表';逐个说参数:INT UNSIGNED AUTO_INCREMENT让主键自动递增,插入时不用自己算 ID;VARCHAR(32)给姓名留三十二个字符,够用又不浪费;age用TINYINT UNSIGNED,取值范围 0 到 255,比INT省三个字节,年龄这种字段没必要用大类型;DEFAULT 0和DEFAULT ''是为了插入时漏字段不至于报错。ENGINE=InnoDB是事务引擎,支持行锁和回滚,8.0 里也是默认值,但显式写出来更清楚。KEY idx_name (name)是按姓名查的时候能走的索引,等数据量上来就知道它的价值了。
如果习惯用图形界面:右键左侧的 Tables → Create Table,在列编辑器里填 Column Name、Datatype,勾上 PK(主键)、NN(非空)、AI(自增),下方切到 Indexes 标签加索引,最后点 Apply。弹出的确认框里会显示将要执行的 DDL,这时候扫一眼,能提前发现类型选错这种问题。
4.3 增删改查:四条语句的边界在哪
数据写入有两种方式。图形界面是右键表 → Select Rows - Limit 1000,在结果网格最下面那行空白处直接填,填完点 Apply,会弹两次确认,第二次才是真正落库。命令行就是 INSERT:
-- 指定列名插入,顺序和列名对上即可,不依赖表结构顺序 INSERT INTO student (name, age, addr) VALUES ('a_name', 21, 'addr_a'); -- 一次插多行,比循环单条插入快一个量级 INSERT INTO student (name, age, addr) VALUES ('b_name', 20, 'addr_b'), ('c_name', 22, 'addr_c');idstudent没在列名里出现,因为它自增,数据库自己填。列名一定要写,不写列名靠位置对应,将来表加一列,所有旧语句全废。
查是最常写的,也最容易写成全表扫:
-- 只取需要的列,别动不动 select * SELECT idstudent, name, age FROM student WHERE name = 'a_name'; -- 排序加分页,数据量大时必须有 limit SELECT idstudent, name FROM student ORDER BY idstudent DESC LIMIT 20; -- 看这条查询走了索引没有 EXPLAIN SELECT idstudent, name FROM student WHERE name = 'a_name';EXPLAIN输出的type列如果是ALL,说明全表扫;是ref或者range,说明用上了索引;key列会告诉你具体走了哪个索引。这是判断“索引到底有没有生效”最直接的办法,比凭感觉猜靠谱。
改和删是事故高发区,核心只有一条:WHERE 条件先验证再执行。
-- 先把要改的行查出来,确认条数和内容 SELECT idstudent, age FROM student WHERE idstudent = 3; -- 再改,改完看影响行数是不是 1 UPDATE student SET age = 19 WHERE idstudent = 3; -- 删之前同样先查,再删 SELECT * FROM student WHERE idstudent = 3; DELETE FROM student WHERE idstudent = 3;UPDATE和DELETE后面不跟 WHERE,作用范围就是整张表。这不是危言耸听,我带过的新人里至少一半在这条上翻过车。有个后悔药可以备着:把改和删包在事务里,看完影响行数再提交。
START TRANSACTION; UPDATE student SET age = 19 WHERE idstudent = 3; -- ROW_COUNT() 返回上一条语句影响的行数,是 1 才符合预期 SELECT ROW_COUNT() AS affected_rows; -- 确认无误再提交;不对就 ROLLBACK 回滚 COMMIT; -- ROLLBACK;START TRANSACTION开启事务,中间的修改对其他会话不可见,COMMIT才真正落盘。ROW_COUNT()是会话级函数,返回上一条 DML 影响的行数,这是判断“我到底改了几行”的硬指标。注意这套只在 InnoDB 上成立,MyISAM 不支持事务,回滚是空话。
5. 避坑清单:安装与首周使用里最容易翻车的五处
5.1 安装与启动阶段的三类拦截
现象一:安装器卡在 Downloading 或者某个组件提示失败。原因:用了在线包,组件要从远端拉,网络一断就卡住;或者某个组件(比如示例库、Excel 插件)下载源不可达。 解决:换成离线 community 包重装;已经装到一半的,在组件失败那一步选择 Skip,先把 Server 和 Workbench 装完,缺的组件后面按需单独补,不影响主流程。
现象二:net start mysql80报“服务名无效”。原因:服务根本没注册(安装时没勾“作为 Windows 服务”),或者服务名不叫这个。 解决:先sc query type= service state= all | findstr /i "mysql"把真实服务名查出来;一个都没有就用mysqld --install手动注册。别反复重装,重装解决不了命名问题。
现象三:安装最后一步配置阶段报端口占用。原因:3306 已经被别的实例或者别的程序占了,常见于机器上装过第二遍 MySQL。 解决:netstat -ano | findstr :3306拿到 PID,再用tasklist | findstr <PID>看是哪个进程。确认是旧实例就停掉,确实要让路就在安装时把端口改成 3307,连接时记得同步改。
现象四:设密码时报ERROR 1819,提示密码策略不满足。原因:安装了密码强度校验组件,默认要求长度和字符类型组合。 解决:换一个符合策略的强密码。生产环境不要为了图方便去调低validate_password的策略等级,那个口子一开,后面所有账号的密码质量都会跟着降。
5.2 连接与数据层的两个高频故障
现象五:某个客户端或程序连上来报Authentication plugin 'caching_sha2_password' cannot be loaded。原因:服务端用的是 8.0 默认的强加密插件,客户端驱动版本太老,不认这个插件。 解决:优先升级驱动,这是根治。实在升不动的老系统,给那一个账号单独改插件,不要动全局默认:
-- 只改指定账号的认证插件,其他账号不受影响 ALTER USER 'app_user'@'localhost' IDENTIFIED WITH mysql_native_password BY '换成强密码'; -- 改完刷新权限 FLUSH PRIVILEGES;ALTER USER后面的'user'@'host'是账号的完整标识,host 部分写错就改不到目标账号;FLUSH PRIVILEGES在改账号密码这类操作后执行一次,确保权限表立刻生效。
现象六:插入的中文在表里显示成问号。原因:链路上有一环不是 utf8mb4,可能是建库时没指定字符集、表继承了库的 latin1、或者客户端连接时没声明字符集。 解决:按“库 → 表 → 连接”三层依次查:
-- 查库和表的字符集 SELECT SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = 'db_2'; SHOW CREATE TABLE student; -- 查当前会话的字符集,三个变量都应该是 utf8mb4 SHOW VARIABLES LIKE 'character_set%';哪一层不是utf8mb4就改哪一层。已经存进去的问号是救不回来的,只能重新插,所以建库那一步把字符集写死,比事后补救省事得多。
6. 把教程用成底子:字符集、认证插件与备份的三项加固
6.1 一次性对齐字符集与认证插件
装完能跑只是及格线,真正让这套环境能长期用的是三件事:字符集统一、认证插件清楚、备份能落地。前两件可以先查现状再决定要不要动:
-- 服务端默认字符集和认证插件,一眼看清底子 SELECT @@character_set_server, @@collation_server, @@default_authentication_plugin; -- 看每个账号用的是哪个插件,兼容问题基本都是这里引起的 SELECT user, host, plugin FROM mysql.user;查出来是utf8mb4就不用动;是latin1或者别的,就在配置文件里把character-set-server改掉再重启服务。mysql.user那张表里的plugin列,能直接告诉你哪些账号是老插件、哪些是新插件,比一个个试连接快得多。
6.2 备份与执行计划:两条命令守住底线
备份这件事,没出事的时候觉得多余,出事的时候是唯一的后悔药。单库备份一条命令就够:
# 单库逻辑备份,输出到一个带日期的文件 mysqldump -uroot -p \ --single-transaction \ --routines --triggers \ --databases db_2 > db_2_backup.sql--single-transaction让备份在一个一致性快照里完成,InnoDB 表不用锁表,业务照跑;--routines --triggers把存储过程和触发器一起导出来,少了这两个参数,恢复出来的库是“缺胳膊少腿”的;--databases会在文件里带上CREATE DATABASE语句,恢复时不用手动建库。恢复就是mysql -uroot -p < db_2_backup.sql,一条命令倒回去。
第二条是执行计划。任何一条要上生产的查询,我都要求先跑一遍EXPLAIN,看type是不是ALL、rows估算多少、key有没有命中。前面建的idx_name到底有没有用,跑一次就知道:
EXPLAIN SELECT idstudent, name FROM student WHERE name = 'a_name';type从ALL变成ref,key显示idx_name,说明索引生效了;如果还是ALL,要么索引没建对,要么条件写法让索引失效了(比如对字段做了函数运算)。
从那以后我每装一台新机器,都会先跑一遍select version()、看一眼character_set%、再做一次mysqldump,三件事都过了才敢往上放业务库。这份教程里那些下载和点选的步骤,配合上面这套命令一起用,能少走一大半弯路。希望帮到你。
本文还有配套的精品资源,点击获取