ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

MySQL 8.0 入门:从环境搭建到建库建表避坑指南

MySQL 8.0 入门:从环境搭建到建库建表避坑指南 1. 环境搭建这一关版本选择、下载安装和首次启动1.1 先说清楚我为什么选 8.0很多人学 MySQL 的第一步就卡在版本选择上。打开官网看到 8.0 和 5.7 两个大版本网上教程各执一词有人说 8.0 改动太大不好上手有人说 5.7 才是生产环境主流。我在整理这篇学习笔记时最终选了 8.0理由很简单你现在学 5.7等你学完去找项目练手的时候会发现新项目几乎都跑在 8.0 上。MySQL 8.0 从 2018 年发布至今已经非常稳定很多新特性比如窗口函数、CTE公共表表达式、默认字符集 utf8mb4 都是 5.7 没有的学新不学旧这本账怎么算都是 8.0 划算。当然 5.7 并没有被淘汰大量存量系统还在用面试的时候也经常会问 5.7 和 8.0 的差异。但如果你是零基础、没有任何历史包袱直接上手 8.0 就好。下载地址就是 MySQL 官网的社区版页面社区版是免费的功能上完全够学习用。下载的时候注意两个细节一是选择MySQL Community Server而不是MySQL Cluster之类的东西二是操作系统版本和你本机一致Windows 就选 Windows InstallerLinux 就选对应发行版的包。安装过程中的核心选项要注意几个端口默认 3306 不用改字符集如果安装器让你选直接选 utf8mb4这是 8.0 的默认值也是目前最通用的字符集能覆盖绝大多数语言的存储需求还有一个MySQL Root Password的设置这里一定要用一个你记得住的密码同时勾选Create a default schema你可以先创建一个学习用的库比如叫 study_db后面建表都往这里放。装完之后有个很容易被忽视的步骤确认服务有没有启动。Windows 下打开服务Win R 输入 services.msc找到 MySQL80状态如果没在正在运行右键启动并且把启动类型改成自动。Linux 下面是 systemctl start mysqld然后 systemctl enable mysqld 让它开机自启。这个动作看着不起眼但能帮你排除掉大量明明装了却连不上的问题。1.2 Windows 和 Linux 两个平台安装差异不少初学者的第一台环境是 Windows所以我先按 Windows 的安装流程说一遍。新版安装器是向导式的基本一路 Next真正需要动脑子的地方集中在Choosing a Setup Type这一步。Developer Default 会装一堆组件里面包含 Workbench 图形化工具、Shell、Router 这些如果你只是想先跑起来选 Server only 就够了省得装一大堆用不上的东西。当然如果你想要图形界面看数据选 Developer Default 里的 Workbench 也是好选择稍后我会专门聊这个工具的用法。相比之下Linux 上的安装要稍微动点手但也并不复杂。CentOS/RHEL 系用 rpm 包安装步骤大概是先到官网下载对应系统的 RPM Bundle 包然后按顺序安装 mysql-community-common、mysql-community-libs、mysql-community-client、mysql-community-server 这四个 rpm 文件。这个顺序不能乱因为前面的包是后面包的依赖。装完之后重点来了第一次启动前先执行 mysqld --initialize --usermysql这个命令会把数据目录初始化好同时生成一个临时密码日志文件里有一条[Note] A temporary password is generated for rootlocalhost: xxxxxxxx这个临时密码只显示这一次忘记的话后面会很被动所以建议初始化完先把日志里的密码复制到文本里存好。Ubuntu/Debian 系就更省事了apt install mysql-server 一条命令搞定装完默认就是启动状态。但不管哪个发行版装完后都有一个必做的步骤运行 mysql_secure_installation它会引导你设置 root 密码、删除匿名用户、禁止 root 远程登录、删除 test 库。虽然每一步都只是问 Yes/No但它实际做的事情是帮你把默认的安全配置收敛到合理的状态。这里插一个真实经历我有一次在 CentOS 上装完后怎么连都提示密码错误排查半天发现是初始化这一步没执行MySQL 进程起不来连接报错自然就被误判成密码问题。所以如果你在 Linux 上装完连不上先确认 mysqld 进程到底有没有在跑用 ps -ef | grep mysqld 看一眼比反复重置密码高效得多。1.3 初始密码一个新手的第一个困惑登录时到底用哪个密码这个问题几乎会拦住每一个刚装完 MySQL 的人。Windows 安装器里你设置的 Root Password 就是你之后登录要用的密码这个没什么悬念。Linux 上绕一点初始密码是系统帮你随机生成的。我在上一节提到了 mysqld --initialize 后会在错误日志里打印临时密码这个日志在 CentOS 上默认路径是 /var/log/mysqld.log可以通过 grep temporary password /var/log/mysqld.log 直接筛出来。拿到临时密码后登录命令是 mysql -uroot -p回车后粘贴临时密码。进去之后第一件事不是建库建表而是立刻改密码。8.0 版本改密码的语法是 ALTER USER rootlocalhost IDENTIFIED BY 你的新密码;注意 8.0 已经不支持 5.7 时代那个 SET PASSWORD FOR ... PASSWORD(xxx) 的写法了。如果你是在云服务器上装的通常还需要额外创建一个允许远程登录的账号因为云厂商的安全组规则一般限制 3306 端口只能从内网访问root 默认绑定的 localhost 你远程根本连不上。还有一个小细节8.0 默认启用了密码验证插件 validate_password它要求新密码至少 8 位并且包含大小写字母和数字。如果只想设一个简单密码比如 123456它会直接报错。初学时别在这上面较劲老老实实按它的规则设一个强度够的密码或者暂时禁用这个插件UNINSTALL COMPONENT file://component_validate_password;。学习阶段禁用没问题生产环境千万别这么干。2. 第一次连接报错排查比安装更值得记录2.1 error 2002 (HY000)90% 的新手都遇过这个报错安装完成之后打开命令行敲 mysql -uroot -p结果直接甩给你一个ERROR 2002 (HY000): Cant connect to local MySQL server through socket /tmp/mysql.sock (2)。这是 MySQL 学习路上第一个具有代表性的报错很多人就是被它卡住然后放弃治疗的。其实这个报错的字面意思很清楚客户端尝试通过 socket 文件连接到本地 MySQL 服务器但连不上。socket 文件就是 MySQL 进程监听在本机上的通信入口路径默认是 /tmp/mysql.sock。报这个错基本可以断定MySQL 服务根本没在运行。排查路径很简单Linux 上执行 systemctl status mysqld 或者 service mysqld status看服务状态是不是 active (running)。如果不是systemctl start mysqld 启动它再连接就通了。Windows 上对应的是任务管理器里的 MySQL 服务进程或者用服务管理界面去启动。还有一种情况是 socket 文件路径不对。MySQL 8.0 在某些发行版上会把 socket 文件放在 /var/run/mysqld/mysqld.sock而客户端默认去 /tmp 下找所以报错提示的 socket 路径不是真实路径。这种问题要么在 my.cnf 里把 socket 路径改成一致的要么连接时指定 socket 路径mysql -uroot -p -S /var/run/mysqld/mysqld.sock。学习阶段用 -S 参数快速绕过问题就好不用急着改配置。我个人的建议是初学者不用死磕这个报错的全部细节你只需要建立一条排查链——服务是否在跑 → socket 路径是否一致 → 端口是否被占用。80% 的情况出在第一步。后面学着学着你会发现2002 这个报错出现频率之高几乎和吃饭喝水一样平常别怕它。如果你连接的是远程数据库报的是 ERROR 2003 (HY000): Cant connect to MySQL server on IP (10061)那走的是 TCP/IP 而不是 socket常见原因是 3306 端口没放通、MySQL 的 bind-address 配置限制、或者是目标主机的防火墙。和 2002 是完全不同的排查方向。初学者经常把 2002 和 2003 混在一起找答案浪费不少时间。先认清一个规律2002 是本地 socket 的问题2003 是网络连通性的问题把这个边界划清楚报错就解决了一半。2.2 连接工具的选择Workbench、Navicat、DBeaver 怎么选命令行连上 MySQL 之后很多初学者会直接用黑窗口敲 SQL这是好事因为命令行能逼你把每条语句的语法看清楚。但有些操作比如浏览表数据、看整个库的结构、调试复杂的查询用图形化工具效率高得多。我目前见过的工具里最常见的三个是 MySQL Workbench、Navicat 和 DBeaver。MySQL Workbench 是 MySQL 官方出的图形化工具免费的跟着安装器装上就能用。它的优势是官方支持、语法提示完整、自带的模型设计功能很强。缺点是启动速度一般某些界面交互逻辑不太符合直觉。对于学习阶段来说它是最稳妥的选择因为你在网上搜到的操作截图大部分都是 Workbench 的。Navicat 是老牌商业工具界面干净、操作流畅很多人第一次用就回不去了。但它收费虽然网上有不少破解版教程我建议你学习阶段不要碰那些东西试用版 14 天完全够你练习用的。如果你以后在工作中遇到团队统一用 Navicat公司自然会配正版授权。用盗版工具学技术这个口子别开后面吃不吃亏先不说心态上就不对。DBeaver 是开源的、免费的对 MySQL 的支持很完整跨平台还支持各种其他数据库。它的社区版足够个人使用界面稍微复杂一点但连接配置很灵活。如果你不想用官方工具DBeaver 是最好的替代品。工具的选择本质上不影响你的 SQL 水平关键是连上之后你要会看看库、看表结构、看索引、看执行计划。图形化工具的价值不在于好看而在于让你对数据库状态有直观感知。我的建议是命令行和图形化工具混着用——日常操作用图形化提高效率涉及权限、配置、排错的问题回命令行操作两边都不生疏。2.3 SSL 连接错误的处理与默认值这个坑现在的 MySQL 8.0 默认开启 SSL 连接所以你会碰到一些和 SSL 有关的报错比如连接时报Error sequence: SSL connection error: unknown certificate之类的问题。学习阶段遇到这种报错最简单的方式是连接时加上 --ssl-modeDISABLED命令行或者在图形化工具的连接配置里把 SSL 选项关掉。因为本地学习环境下不存在数据被窃听的风险关闭 SSL 不影响你练习。这里顺带提一个热搜词里出现的问题mysql 设置默认值为 0。这个其实是建表时给字段设置默认值比如一个 status 字段你希望它在不填的情况下是 0建表语句就可以写status INT DEFAULT 0。很多初学者建完表之后发现 我设了默认值怎么没生效原因通常有两个一是 DEFAULT 只对 INSERT 时不指定该列的情况生效你如果显式插入了一个 NULL默认值不会替代它二是字段如果设置了 NOT NULL DEFAULT插入 NULL 会直接报错而不是静默替换成默认值。想要 插入 NULL 时自动变 0 需要额外写触发器或在应用层处理。这个知识点我在第一章前两节整理时专门标注过因为它非常容易在后面的练习中反复踩坑。3. 建库建表之前先把这些概念理清楚3.1 库、表、字段、记录一套完整的逻辑MySQL 学习到第一个台阶是把数据库这个概念从名词变成你脑中的一个结构图。MySQL 本身是一个数据库管理系统它里面可以创建多个数据库也叫 Schema每个数据库里可以放多张表每张表由字段列和记录行组成。这套层级结构是关系型数据库通用的学会了 MySQL 之后去用 PostgreSQL、SQL Server 都是同一套思维。举个例子。你要做一个学生成绩系统可以先建一个数据库叫 exam_db然后在里面建一张表叫 student_score表里有 student_name、subject、score、exam_date 这几个字段。每当你向这张表插入一条数据就多了一条记录。查询就是在这张表里挑出满足条件的一些记录。这套逻辑简单直白真正要花心思的是表到底怎么设计。比如一个学生的多科成绩是放在同一行一行包含语文、数学、英语三列还是分成三行每科一行这就要引入范式和冗余的取舍了。第一章前两节课上刚好把物理设计和逻辑设计的区别讲了一下——你脑子里怎么组织数据是一回事在表里怎么落地是另一回事这个思维转变越早完成越好。学习的时候有一个很实用的技巧每当你要新建一张表之前先在纸上画出它的结构列出字段名、字段类型、是否是主键、能否为空然后再去写 CREATE TABLE。我在前两节里做的一个练习表结构是这样的字段名类型允许NULL默认值说明idINTNO无主键自增nameVARCHAR(50)NO无学生姓名courseVARCHAR(30)NO无课程名称scoreDECIMAL(5,2)YESNULL成绩exam_dateDATEYESNULL考试日期设计好结构再敲语句你手写 SQL 的时候就不容易卡壳。很多初学者拿到 SQL 教程就说语句太长记不住其实不是记不住是没想清楚自己到底要建一个什么样的结构。结构明确语法只是顺带的事情。3.2 数据类型不是一个填空题它决定性能和习惯MySQL 的字段分类大概有数值型、字符串型、日期时间型、枚举型这几类学习阶段不需要背全但必须理解为什么要有类型。你想想如果你只需要 0 到 9 之间的数字用 tinyint 一个字节存就好如果你用 int四个字节存储空间多花三倍索引效率也受影响。类型不是随便选的填空题它直接关系到数据在磁盘上的占用量、查询的比较速度、以及你后续写 SQL 时函数的兼容性。最常用的一组类型值得反复练习INT 保存整数DECIMAL 保存带小数的精确数值比如金额千万别用 FLOAT会有精度丢失VARCHAR 保存变长字符串DATE/DATETIME 保存日期和时间TEXT 保存长文本。这里我特别说下 DECIMAL 和 FLOAT 的差别。FLOAT/Double 是浮点数计算机用二进制存储0.1 这种小数在二进制里是无限循环的所以求和可能出现 0.1 0.2 0.30000000000000004。DECIMAL 是定点数按小数位精确存储钱相关的数据必须用它。这个知识点如果你没学过后面做项目做计算的时候会发现结果对不上那才是真正的噩梦。有人说学 MySQL 用不着懂那么多类型细节反正可以慢慢改但在实际开发场景下改一张大表的字段类型是要停服务的成本极高。你现在多花十分钟搞懂类型后面能省下几天的时间。3.3 int(5) 这个东西到底是什么意思热搜词里有一条mysql 中 int5很多人刚学到建表的时候会看到这样的写法age INT(5)然后下意识觉得括号里的 5 表示这个整数最多存 5 位。这个理解是错的而且错得很隐蔽。INT(5) 不是限制存储长度而是显示宽度。在 MySQL 里INT 类型不管括号里写几存储空间都是 4 字节取值范围都一样最大能存 2147483647 这种远超 5 位的数字。括号里的 5 只是配合 ZEROFILL 属性时起作用如果字段设置了 INT(5) ZEROFILL那么当数据是 12 时实际显示出来是 00012补零到 5 位宽度不影响存储数值本身。如果你没设置 ZEROFILL这个 5 对实际存储和显示都没有任何影响写不写都一样。所以看到网上有人教「INT(11)限制整数长度我在学习笔记里明确标注了这是误传。11 同样只是默认显示宽度MySQL 8.0 里 INT 的默认显示宽度是 11 而已。那为什么会出现这种写法因为 MySQL 早期版本从 Oracle 的风格沿用了显示宽度这个设计但实际使用中确保字段值不超过某个长度上限应该是应用层做的事情不该依赖数据库字段类型的括号参数。现在 8.0 也推荐直接用 INT 或 INT UNSIGNED后面那个括号参数能省就省至少别把它当成长度限制来用。这个冷知识看着小但它反映了学数据库一个很重要的心态——不要只看表面语法要看语法背后的机制。知道 INT(5) 怎么来的比记住它怎么用更有价值。4. 前两节的核心实操登录、建库、建表、插入一个都不能少4.1 四个动作覆盖前两节课的全部重点前两节课如果忽略概念叙述落到实操层面其实就是四个动作登录数据库、建库、建表、插入数据。这四个动作是未来所有 SQL 操作的地基我在笔记里把每一步的完整命令整理成了一个小抄。登录命令前面已经提过多次这里把变体补齐登录本地mysql -uroot -p登录指定端口mysql -uroot -p -P 3307登录远程mysql -uroot -p -h 192.168.1.100指定 socketmysql -uroot -p -S /tmp/mysql.sock建库命令CREATE DATABASE IF NOT EXISTS study_db DEFAULT CHARACTER SET utf8mb4; USE study_db;建表命令参考前面那张 student_score 表结构CREATE TABLE student_score ( id INT UNSIGNED NOT NULL AUTO_INCREMENT, name VARCHAR(50) NOT NULL, course VARCHAR(30) NOT NULL, score DECIMAL(5,2) DEFAULT NULL, exam_date DATE DEFAULT NULL, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;插入命令INSERT INTO student_score (name, course, score, exam_date) VALUES (小明, 数学, 95.50, 2026-03-02);这四个动作我建议你至少手敲三遍别复制粘贴。特别是中间那个 USE 语句很多人建完库就忘了切库后面 CREATE TABLE 一直报错说没有选择数据库其实就少了这一句。key 自己敲一遍比看教程十遍都管用手指是有记忆的。4.2 我踩过的坑分号、大小写、字符集手敲 SQL 的过程中最常见的翻车点不是语法你不会而是细节你没注意。我把前两节实操中踩过的坑整理出来这些坑十有八九你也会碰。第一个坑是分号。MySQL 客户端会等你输入分号才执行语句如果你忘记在语句结尾加分号它会一直显示一个-等候继续输入好像卡住了一样。这时候不用慌把分号补上回车就行。如果你压根不知道这句命令没执行直接在后面接着敲了其他内容系统会把它当成同一条语句解析然后报一堆莫名其妙的语法错误。所以新手记住一件事每条 SQL 语句结尾必须带分号这是 MySQL 客户端的执行标志不是可选项。第二个坑是大小写。MySQL 的 SQL 关键字SELECT、INSERT、CREATE 这些不区分大小写但如果你在 Linux 上建了表名表名是区分大小写的Windows 上不区分。这容易造成开发时好好的部署到 Linux 就报表不存在。我前两节练习时在小写库名上吃了点亏之后统一了规范库名、表名、字段名全部小写单词之间用下划线分隔。这样无论在哪个系统上都不会出问题。这个规范也是很多公司实际在执行的。第三个坑是字符集。如果你建表的时候没指定 CHARSETutf8mb4而 MySQL 默认配置又不是 utf8mb4那插入中文就可能变成问号。检查的语句是SHOW VARIABLES LIKE character_set_%;看到 database 和 server 的字符集都是 utf8mb4 就安全了。这个坑在学习阶段特别容易踩因为新手往往只关注语法对不对不会想到环境本身有问题。一旦出现中文乱码先查字符集再查数据这个顺序能快速定位。4.3 一条查询语句看懂SELECT FROM WHERE的执行思路前两节如果有人只练了 INSERT 而没有练 SELECT我会建议你把 SELECT 补上。因为插入数据只是让数据存在了数据读出来才是后面所有复杂查询的起点。一个最基础的查询是SELECT name, score FROM student_score WHERE course 数学;执行思路要理解清楚先找到表 student_score然后按 course 数学 这个条件一行行筛选最后只输出 name 和 score 两列的数据。顺序很重要——先定位表再过滤行最后收缩列。虽然你在客户端的输入顺序是先 SELECT 后 FROM 后 WHERE和执行的逻辑顺序不一样但只要你脑子清楚它到底先做什么后做什么后面学 JOIN、GROUP BY 都不会被绕晕。这个阶段我还建议你去试一试带别名的查询SELECT s.name AS 学生姓名, s.score AS 成绩 FROM student_score AS s WHERE s.score 60;AS 就是给字段或表起个别名。别名在后续多表联合查询时非常重要因为不同表里会有同名字段不加别名就分不清。前两节先习惯给表加别名后面写复杂查询会顺畅得多。关于排序热搜词里也出现了mysql 排序这里先做一个铺垫SELECT name, score FROM student_score ORDER BY score DESC;DESC 是降序ASC 是升序。排序和 WHERE 组合时执行顺序也值得记一下先 WHERE 筛选再 ORDER BY 排序。别把顺序搞反了否则你想只拿及格的人里分数最高的却在 WHERE 之前就对全表排了序最终返回的行没有错但逻辑上是一个坏习惯。4.4 我建议的笔记方法把命令和报错一起记最后聊一个可能很多人不重视但对学习效率影响很大的事情笔记怎么写。我整理 MySQL 第一章前两节笔记时没有用通篇抄教程的方式而是给每条命令开了一个条目下面记录三样东西命令本身、命令效果说明、我当时踩过的报错。比如 CREATE DATABASE 这条命令我旁边会标注如果报 ERROR 1007说明库已存在加 IF NOT EXISTS 可以忽略这个错误。这个命令 报错的对照方式比单纯抄一遍命令有用得多因为你以后回头看笔记时真正帮你快速回忆的不是语法而是当时那个报错是怎么解决的。我还额外开了一个坑清单文件专门记录各类问题的排查链路。比如前面提到的 2002 报错我记的是先看服务状态 → 再看 socket 路径 → 最后看端口。这种排查链路式的笔记比零散的信息片段更有迁移价值。等你学到后面涉及主从复制、性能调优、事务并发这些章节时你会发现解决问题的思路其实早就从第一章的这几个报错里开始成型了。学习 MySQL 从来不是背 SQL 语法的大赛而是不断建立为什么和怎么办的过程。前两节只是起点但一个带着为什么去学的开头会让后面所有章节都变得清楚很多。
返回列表