MySQL 8.0安装配置、IDEA/Navicat连接与实体类生成实战 MySQL 环境搭建这件事说简单也简单说折磨人也真折磨人——我见过太多人在新电脑上装 MySQL 8.0装完之后 IDEA 连不上、Navicat 报时区错误、建表时字段类型选错导致后面改表改到崩溃。这篇就把 MySQL 的安装配置、IDEA 连接、Navicat 连接、以及从建表到自动生成实体类的整条链路按照我平时实际操作的顺序完整捋一遍。不管你是刚接触数据库的学生还是要给新同事配环境的带教照着走一遍基本能把环境跑通中间几个特别容易踩的地方我也会把原因讲清楚省得你只知道抄配置却不知道为什么这么写。1. 动手之前先定版本和安装方式很多人装 MySQL 卡住根子不在安装过程而在动手前没想清楚两件事装哪个版本、用哪种安装方式。这两个决定一旦选错后面所有配置都会别扭。1.1 MySQL 8.0 和 5.7 到底选哪个现在官方主推的是 8.0 系列5.7 早就进入停止维护阶段了。新项目我建议直接上 8.0原因不复杂默认字符集从 latin1 换成了 utf8mb4默认排序规则是 utf8mb4_0900_ai_ci意味着存中文、emoji 都不会再出现问号乱码省掉一堆手动改字符集的活。另外 8.0 的窗口函数、CTE、降序索引这些特性在写复杂查询的时候是真能救命。但有一个现实情况要提醒如果你在维护一个老系统它的驱动版本还停留在 5.1.x那么接 MySQL 8.0 会直接报Unknown system variable query_cache_size之类的错。这时候要么升级驱动到 8.x要么就老老实实装 5.7。所以选版本的判断标准其实就一条看你的项目驱动和框架依赖而不是看网上说哪个新。还有一个隐藏坑是版本号里的位数。Windows 上务必下 64 位版本现在基本没有 32 位机器了但有些老教学视频还在演示 x86 安装包照着装完内存用不满性能直接打折。1.2 Installer 安装版和解压版区别比你想的大官方提供两种主要形式一个是 MySQL Installer图形化安装向导另一个是 ZIP Archive解压即用的绿色版。对比项Installer 安装版ZIP 解压版上手难度低一路下一步中要手写配置文件系统服务自动注册手动注册卸载干净度有卸载程序但残留多删目录即可多版本共存麻烦方便改端口即可适合人群初学者、单版本环境需要切换版本、想搞懂配置的人我自己的习惯是笔记本上装 Installer 版图省事但在做教学或者需要同时跑 5.7 和 8.0 的机器上一定用解压版。因为解压版把my.ini摆在你面前端口、数据目录、字符集全都看得见出问题的时候你知道去哪儿改。Installer 版把这些都隐藏在向导里一旦出问题反而不好排查。提示两个版本不要装在同一台机器上还共用同一个数据目录会直接把数据文件搞坏。要么端口错开3306 / 3307要么干脆用不同机器或者容器。1.3 从官方渠道取安装包并核对完整性安装包我只从官网下不是矫情是因为第三方站点的包经常被塞东西或者版本号对不上。官网下载页选 Windows (x86, 64-bit), MSI Installer 或者 ZIP Archive。下载完顺手看一眼文件大小和哈希值跟页面上标注的对一下能排除掉下载中断导致的半截包。这一步看着像多余但我确实遇到过同事因为安装包损坏装到一半卡在 Applying security settings 界面反复重装了三次才发现是包的问题。校验一次两分钟能省一下午。2. Windows 下把 MySQL 服务跑起来安装过程本身没什么可讲的真正决定这套环境能不能用很久的是那几个配置项和服务注册方式。2.1 向导里的几个关键选择项跑 Installer 的时候Setup Type 建议选 Custom自己挑组件别选 Developer Default。因为 Default 会把 MySQL Shell、Router、Workbench、示例库全给你装上光是启动项就一堆对只想跑个数据库的人来说纯属负担。选 Custom只勾 MySQL Server 和 MySQL Workbench 就够了Workbench 后面建连接的时候还能当备用工具。进到 Type and Networking 这一步Config Type 选 Development Computer它会用较小的初始内存占用如果你这台机器就是专门做数据服务的才考虑 Server Computer。Port 保持 3306除非你机器上已经有一个 MySQL 在跑那就改成 3307同时记住这个端口后面连接时要用。Authentication Method 这步很多人会纠结。它给两个选项强密码加密caching_sha2_password和传统加密mysql_native_password。新手建议直接选传统加密因为不少老驱动和老客户端不认 caching_sha2_password连接时会报Authentication plugin caching_sha2_password cannot be loaded。等你确认自己的驱动是 8.x 之后再改回强加密也不迟。2.2 root 密码和字符集设置的取舍设置 root 密码这步别图省事设成123456或者root。这台机器上的数据库如果连了外网弱密码被扫是分分钟的事。我一般会用一个自己记得住但又足够长的组合并且单独建一个业务账号给应用用root 只留给本机维护。后面的 Windows Service 环节勾上 Configure MySQL Server as a Windows Service服务名保持 MySQL80 或者你自定义一个。这样开机就自动启动不用每次手动开。真正容易被忽略的是字符集这一步。8.0 默认已经是 utf8mb4 了但如果你装的是 5.7 或者中途改过一定要在向导里把 Character Set 显式设成 utf8mb4Collation 选 utf8mb4_general_ci 或者 utf8mb4_0900_ai_ci。如果向导里没给你这个选项那就装完之后手动去my.ini里加[mysqld] character-set-serverutf8mb4 collation-serverutf8mb4_general_ci [client] default-character-setutf8mb4改完必须重启服务才生效net stop mysql80 net start mysql80。2.3 用 ZIP 版手动注册服务的完整流程如果你走的是解压版流程是这样的。先把 ZIP 解压到一个没有中文、没有空格的路径比如D:\mysql-8.0.36。中文路径在某些场景下会导致初始化失败这个坑很多人都踩过。然后在根目录下新建my.ini[mysqld] basedirD:/mysql-8.0.36 datadirD:/mysql-8.0.36/data port3306 character-set-serverutf8mb4 default-storage-engineINNODB [client] port3306 default-character-setutf8mb4注意路径用的是正斜杠Windows 下反斜杠在 ini 文件里会被当成转义符容易出问题。接着以管理员身份开命令行执行初始化mysqld --initialize --console这条命令会在控制台输出一个临时 root 密码立刻复制下来只显示这一次。如果你想要空密码方便本地调试可以用mysqld --initialize-insecure但仅限本机开发环境。最后注册服务并启动mysqld --install mysql80 net start mysql80到这一步数据库就起来了。用mysql -uroot -p登录进去第一件事就是ALTER USER rootlocalhost IDENTIFIED BY 你的新密码;。3. 登录之后立刻要做的三件收尾工作很多人装完能连上就觉得结束了其实这时候数据库还没真正可用。下面这几件事不做后面连接 IDEA 和 Navicat 的时候一定出问题。3.1 确认字符集和排序规则真的生效了登录后先敲SHOW VARIABLES LIKE character%; SHOW VARIABLES LIKE collation%;看character_set_server和character_set_database是不是 utf8mb4。如果还是 latin1说明你的my.ini没被读到——要么路径不对要么服务没重启。这是排查字符集问题的第一站。排序规则那边utf8mb4_general_ci和utf8mb4_0900_ai_ci的区别值得知道后者是 8.0 新增的对 Unicode 的处理更规范大小写和重音的比较规则更贴近标准。新库我一般用 0900_ai_ci老项目兼容就沿用 general_ci但一个库里混用两种排序规则在做 JOIN 的时候会报 Illegal mix of collations。所以建库时定好后面所有表都跟着走。3.2 建一个应用专用账号而不是一直用 root这件事我在团队里强调过很多次。应用连数据库用 root等于把整个数据库的生杀大权都交出去了一旦配置文件泄露后果很严重。正确做法是新建账号并只授予必要的权限CREATE USER app_user% IDENTIFIED BY 一个强密码; GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.* TO app_user%; FLUSH PRIVILEGES;注意app_user%里的%表示允许任意主机连接。本地开发图方便可以这么写但如果数据库对外提供服务最好限定成具体 IP 段或者localhost。如果连不上先检查user表里的 host 字段匹配情况SELECT user, host FROM mysql.user;你的连接来源是localhost走本地 socket是127.0.0.1走 TCP两者在权限表里是不同的记录。这个小细节绊倒过不少人明明建了账号却提示 Access denied。3.3 忘记密码时的重置思路这个不属于正常流程但属于必备技能。思路是让服务跳过权限检查启动改完密码再恢复正常启动。net stop mysql80 mysqld --skip-grant-tables --console另开一个命令行窗口登录这时候任何密码都能进然后FLUSH PRIVILEGES; ALTER USER rootlocalhost IDENTIFIED BY 新密码;改完关掉这个临时进程正常启动服务。注意--skip-grant-tables状态下不能直接执行 ALTER USER必须先 FLUSH PRIVILEGES 刷新权限表否则会报错。这个顺序我是踩过一次才记住的。4. IDEA 里连接数据库并反向生成实体类IDEA 自带的 Database 工具是我最常用的功能之一它比第三方客户端更贴近代码尤其是自动生成实体类这一点能省掉大量手写 POJO 的时间。4.1 Database 窗口里配置连接打开 View → Tool Windows → Database点左上角加号选 Data Source → MySQL。填 Host、Port、User、Password、Database。第一次点 Test Connection大概率会失败报错通常是这两类Public Key Retrieval is not allowedThe server time zone value XXX is unrecognized第一种是因为 8.0 用 caching_sha2_password 认证客户端需要拿到公钥。解决办法是在 URL 后面加参数jdbc:mysql://localhost:3306/mydb?useSSLfalseallowPublicKeyRetrievaltrueserverTimezoneAsia/Shanghai第二种是时区问题serverTimezone必须显式指定否则 MySQL 8.0 的新驱动不知道该按哪个时区解析时间。注意useSSLfalse只在本地开发环境用生产环境应该配好证书走加密连接关掉 SSL 只是图个连接稳定别把这个配置带上线。4.2 驱动版本不匹配是最高频的报错源IDEA 里换驱动很方便但还是建议先看清你项目里实际用的驱动 jar 是哪个版本。com.mysql.jdbc.Driver是 5.x 的老驱动com.mysql.cj.jdbc.Driver是 8.x 的新驱动。如果项目里 pom 引的是 8.0.33而 IDEA 的 Data Source 用了自带的 5.1 驱动就会出现在 IDEA 里能连上跑代码却连不上的诡异现象。解决方式是点 Data Source 里的 Driver 设置手动指定到项目依赖的驱动版本或者干脆用 Maven 仓库里的那个 jar。保持 IDEA 和代码用同一个驱动能避开一大半玄学报错。4.3 从表结构直接生成实体类连接成功后展开数据库选中表右键 → Generate → 找到 Scripted Extensions 或者走 Persistence 这条路先在项目里打开 Persistence 窗口View → Tool Windows → Persistence右键项目 → Generate Persistence Mapping → By Database Schema。在弹出的配置界面里选择数据源、要生成的包名、实体类命名规则还可以勾选是否生成 Lombok 注解、是否生成 JPA 注解。生成的实体类字段名和表字段会自动做驼峰映射比如user_name变成userName。这里有个细节IDEA 默认把 tinyint(1) 映射成 Boolean如果你表里用 tinyint 存状态值0/1/2 这种生成的类型会不准确。这时候要么在建表时避开 tinyint(1) 写法用 tinyint 不带括号长度要么生成后手动改成 Integer。这个坑我在实际项目里踩过状态值 2 被转成 true 之后再转回 int 就变成 1 了排查了半天。5. Navicat 连接与图形化建表的实操细节Navicat 的优势在于界面直白、导入导出方便尤其适合做数据核对和临时的表结构维护。连接本身不难难的是建表时那些字段类型和约束怎么选。5.1 新建连接和端口映射的处理打开 NavicatConnection → MySQL填连接名、Host、Port、用户名密码。Test Connection 通过后保存即可。如果数据库跑在虚拟机或者远程服务器上常见的问题是防火墙没放行 3306或者 MySQL 只监听了127.0.0.1。检查my.ini里有没有bind-address 0.0.0.0没有的话远程连不上。改完记得重启服务并确认云服务器的安全组也放行了对应端口。Navicat 里如果同一个库有多个连接建议把连接名写清楚比如本地-3306-开发库否则连接列表一多误操作到生产库是很危险的。我认识的人里就有因为在 Navicat 里连错库把一个线上表给清空的。所以我在生产连接上都加了明显的前缀并且关闭了自动提交。5.2 图形化建表时字段类型怎么选在 Navicat 里右键库 → New Table会进入表格设计界面。这里每一项都值得说清楚主键 id类型bigint勾选 Auto IncrementNot Null。用 bigint 而不是 int是因为 int 上限约 21 亿业务量大的时候很容易撞天花板改主键类型代价极高。字符串字段varchar带明确长度比如用户名varchar(64)手机号varchar(20)。不要所有字段都写 255那样索引会变胖查询变慢。金额字段一定用decimal(10,2)绝对不要用 float 或 double。浮点数存 0.1 0.2 不等于 0.3 这件事在金额上是灾难性的。时间字段datetime和timestamp的区别要搞清。timestamp 会随时区变化范围只到 2038 年datetime 存的是字面值不受时区影响范围到 9999 年。业务时间我一般用 datetime。状态字段用tinyint不带长度配合注释写清楚每个值的含义。一个建表的示例 SQL 大概长这样CREATE TABLE t_user ( id bigint NOT NULL AUTO_INCREMENT COMMENT 主键, user_name varchar(64) NOT NULL COMMENT 用户名, phone varchar(20) DEFAULT NULL COMMENT 手机号, balance decimal(10,2) NOT NULL DEFAULT 0.00 COMMENT 账户余额, status tinyint NOT NULL DEFAULT 1 COMMENT 状态 1正常 0禁用, create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间, PRIMARY KEY (id), UNIQUE KEY uk_user_name (user_name) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT用户表;5.3 建表过程中最常见的几类异常建表报错几乎都集中在这几个错误码上认脸熟之后排查会快很多。错误码含义常见原因与处理1050表已存在换个表名或先 DROP 再建1064SQL 语法错误检查反引号、逗号、括号配对1071索引长度超限给 varchar 建索引时长度太大改用前缀索引1118行大小超限单表 varchar 太多考虑拆表或改 text1366字符集不兼容连接字符集与表字符集不一致统一成 utf8mb41071 这个特别典型。用 utf8mb4 时一个字符最多占 4 字节InnoDB 单列索引最大 3072 字节也就是 varchar 大概 768 字符以内可以完整建索引。你如果给varchar(1000)直接建唯一索引就会报 1071。解决办法是建前缀索引ALTER TABLE t_user ADD UNIQUE KEY uk_name (user_name(191));191 这个数字是老版本留下的经验值因为早期 utf8mb4 索引上限是 767 字节767 / 4 ≈ 191。现在 8.0 放宽了但 191 仍然是个安全选择。6. 把环境真正用起来之后的几点经验环境跑通只是起点能不能用得顺手取决于你有没有把一些习惯提前建立起来。6.1 跨平台迁移时的表名大小写问题Windows 上的 MySQL 默认lower_case_table_names1表名不区分大小写Linux 上默认是 0区分大小写。这意味着你在 Windows 上写的T_User迁到 Linux 上可能就找不到了。统一用小写加下划线命名表名能直接避开这个问题也符合大多数团队的规范。改这个参数必须在初始化之前设置初始化之后再改会导致数据目录启动失败这是硬性限制别在中途去动它。6.2 连接串里的参数别一股脑复制网上流传的连接串经常堆了七八个参数什么useUnicodetruecharacterEncodingutf8autoReconnecttrue。里面有些在 8.0 里已经没必要了比如 useUnicode8.0 默认就是 Unicode。参数越多出问题时越难定位是哪一个导致的。我的做法是只保留真正需要的serverTimezone、allowPublicKeyRetrieval、必要的useSSL其余按需再加。6.3 本地开发库的备份节奏本地库崩了重建其实很快但如果里面有你自己造的一批测试数据重造就很烦。所以我在建完表、导入初始数据之后会用 Navicat 的 Dump SQL File 功能把结构和数据导出一份放在项目目录的db/文件夹里。这样换电脑或者误删库时一条命令就能恢复mysql -uroot -p mydb db/mydb_init.sql这个习惯看起来不起眼但在我换过几次开发机之后它救了我至少两次。走到这儿从 MySQL 安装、服务注册、账号权限到 IDEA 连库生成实体类、Navicat 建表、常见异常处理整条链路应该都能独立走通了。真正让环境稳定的从来不是某个神奇配置而是把字符集、驱动版本、字段类型这几处基础打牢后面遇到再奇怪的报错排查方向也就那么几条。