ARTICLE DETAIL

资讯详情

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

Windows 下 MySQL 5.6 安装配置、环境变量与报错排查

Windows 下 MySQL 5.6 安装配置、环境变量与报错排查 接手一个2016年前后上线的老系统翻开源码发现连接串里写死了mysql-connector-java-5.1.30SQL 里还有几处依赖GROUP BY隐式排序的写法这时候你大概率会被迫把目标版本从 8.0 降回 5.6。MySQL5.6 的下载安装本身并不复杂真正让人反复折腾的往往是配置环境变量这一步——路径一改命令行就失效服务注册完找不到 bin 目录初始化数据目录时又冒出一堆字符集和索引长度的报错。这篇按我自己在 Windows 上重装过十几遍的流程把下载、解压、配置环境变量、初始化、注册服务、改密码和排查报错整条链路捋清楚顺带把那些官方文档不写、但一定会踩的坑标出来。适合被老项目拴住的后端同学、刚接手运维的测试同学以及需要在本地复现历史环境的教学场景。1. 都什么年代了为什么还要装 MySQL 5.61.1 三个让你不得不低头的真实场景先说结论如果你手上的项目全新起步别碰 5.6。MySQL 5.6 的官方技术支持在 2021 年 2 月就已经停止后续不会再有任何安全补丁把这个版本放到公网可访问的环境里等于给自己的运维台账埋雷。但现实里确实有几类场景绕不开它。第一类是老系统的语法兼容。5.6 的sql_mode默认只有NO_ENGINE_SUBSTITUTION不含ONLY_FULL_GROUP_BY也不含STRICT_TRANS_TABLES。这意味着大量“SELECT的字段不在GROUP BY里”“插入超长字符串被静默截断”的代码在 5.6 上跑得好好的一旦换成 5.7 或 8.0直接报1055和1406。有些系统的 SQL 写了几千行短期改不动只能把数据库版本钉死。第二类是第三方交付或设备对接。某些行业软件、考试系统、老版本的报表中间件安装包里自带的 JDBC 驱动就是给 5.6 配套的对方的技术支持明确要求“数据库版本 5.6.x低版本不支持”。这种时候你连商量的余地都没有。第三类是教学和考证。不少教材、实验指导书还停留在 5.6 的语法和界面截图学生在 8.0 上照着做光是mysql_install_db找不到、utf8报错这两件事就能耗掉半节课。明确一点这篇内容适合在本地开发机、隔离测试环境里复原 5.6不适合新上生产。1.2 三个版本的关键差异对照很多人栽跟头是因为拿 8.0 的经验去套 5.6结果每一步都对不上。下面这张表把差异集中列出来后面章节反复会用到。对比项MySQL 5.6MySQL 5.7MySQL 8.0服务器默认字符集latin1latin1utf8mb4认证插件mysql_native_passwordmysql_native_passwordcaching_sha2_password数据目录初始化mysql_install_dbmysqld --initializemysqld --initializemysql.user 密码列Passwordauthentication_stringauthentication_string系统表存储引擎MyISAMInnoDB5.7.6InnoDB默认 sql_modeNO_ENGINE_SUBSTITUTION含 ONLY_FULL_GROUP_BY、STRICT_TRANS_TABLES在 5.7 基础上更严JSON 类型无支持支持窗口函数 / CTE无无支持utf8mb4 索引前缀默认 767 字节默认 767 字节默认 3072 字节表里最容易被忽略的是倒数第二行和最后一行。utf8mb4下建一个带索引的VARCHAR(255)在 8.0 上毫无压力在 5.6 上会直接给你一个ERROR 1071。原因在第五章会算给你看。2. 下载之前先把安装包类型和落盘路径定死2.1 ZIP 免安装包和 MSI 安装包怎么选Windows 上的 MySQL 5.6 有两种主流分发形式MSI 安装器Windows Installer和 ZIP 免安装压缩包。两者差别很大选错了后面会很别扭。对比维度MSI 安装器ZIP 免安装包安装复杂度图形向导一步步点解压即完成但要手工初始化目录可控性默认往 Program Files 里塞想放哪放哪卸载干净度注册表、服务、数据目录残留较多删目录、删服务就干净多实例支持比较麻烦复制一份目录改端口即可环境变量配置向导里能勾选完全手工正是本文重点我的建议是直接上 ZIP 包。理由很实在MSI 默认把程序装到C:\Program Files\MySQL\...这个路径带空格后续在命令行里引用、写服务参数、配--defaults-file的时候凡是忘了加引号的地方都会出问题。而 ZIP 包解压到C:\mysql\...这种短路径命令写起来干净出问题也好排查。另外 MSI 卸载后经常留下服务项和my.ini下次装同版本会提示“服务已存在”反而更烦。2.2 从官方归档里拿到 5.6 的最后一版5.6 已经不在主下载页面了要去官方归档区找。页面路径大致是“下载页 → 相关下载 → 归档版本”这一条线进去以后需要先从产品下拉框里选 MySQL Community Server再在版本下拉里挑 5.6.x。这里有两个实际经验第一5.6 系列最后一个发行版是 5.6.51从它之后就没有更新了。直接选这个版本不要挑中间的小版本早期 5.6.x比如 5.6.0 到 5.6.7连mysql_install_db.exe这个 Windows 专用初始化程序都没有只能用 Perl 脚本而 Windows 上默认没装 Perl等于给自己加难度。第二归档区的下载按钮会要求登录账号。这是官方的策略不是资源有问题。注册一个免费账号登录即可。如果不方便登录也可以走国内高校的开源镜像站常见的几个镜像站都保留着历史版本的 Windows ZIP 包文件名核对一下是mysql-5.6.51-winx64.zip就行大小在 300 MB 上下。下载完对一下文件大小和压缩包能否正常打开能正常解压基本就没问题。注意别用第三方“绿色版”“精简版”“一键安装包”。这类包经常被塞进额外的启动脚本、篡改过的配置文件甚至预置了不明账号。数据库跑的是业务数据安装包只认官方或可信镜像。3. 解压与环境变量落地路径规划决定后面顺不顺3.1 路径命名的三条硬规矩这一步看着简单实际上后面百分之六十的“莫名其妙”都源于路径没规划好。规矩一路径里不许出现空格。C:\Program Files、C:\Users\张三\Desktop这类路径在写服务参数、配--defaults-file、写批处理脚本的时候必须处处加引号。少加一处就报错而且报错信息往往指向别的地方很难找。直接用C:\mysql\mysql-5.6.51-winx64这种没有空格的路径。规矩二路径里不许出现中文和特殊符号。中文路径会导致mysql_install_db.exe在某些系统区域设置下无法创建数据目录报错信息是Failed to create the data directory但不会告诉你是因为路径有中文。括号、、#这些字符同理。规矩三不要放在系统盘根目录下面的深层嵌套里也不要用桌面或下载目录。桌面和下载目录在某些清理软件的扫描范围内误删一次数据目录哭都来不及。放在C:\mysql\或者D:\mysql\下一层清爽又好找。综合下来我推荐的结构是C:\mysql\ └── mysql-5.6.51-winx64\ - 解压出来的程序根目录basedir ├── bin\ - 可执行文件环境变量要指向这里 ├── data\ - 初始化后自动生成放数据 ├── include\ ├── lib\ ├── share\ └── my-default.ini - 模板文件需要自己改名改写3.2 解压后目录里都有什么解压完先别急着配环境变量花两分钟把目录结构认一遍后面少走弯路。bin目录是核心里面几个必须认识的可执行文件mysqld.exe是数据库服务进程本身真正干活的mysql.exe是命令行客户端我们平时敲的 SQL 都通过它mysqladmin.exe用来关库、改密码、查状态mysql_install_db.exe是 Windows 专用的初始化工具5.6 里初始化数据目录全靠它mysqldump.exe是逻辑备份工具后面备份会用到。根目录下那个my-default.ini是个模板里面大部分内容被注释掉了写了几行示例。它是给你抄的不是给服务器读的。服务器真正读取的文件叫my.ini需要你自己复制一份改名再改内容。这个区别要记住很多人改了my-default.ini发现配置不生效就是改错了文件。还有一个细节解压完的目录里没有data文件夹。5.6 的 ZIP 包是纯程序包数据目录必须初始化才能生成。这也是为什么不能解压完就直接启动——直接跑mysqld会因为没有mysql系统库而失败。4. 配置环境变量把 mysql 命令变成随手可用4.1 环境变量到底解决了什么问题先说清楚原理不然照着敲也不知道自己在干嘛。Windows 执行一条命令时会去PATH环境变量里登记的目录列表中逐个查找同名可执行文件。如果bin目录不在PATH里你就必须写全路径C:\mysql\mysql-5.6.51-winx64\bin\mysql.exe -u root -p。每敲一次都要写这么长一串谁能受得了。把bin目录加进PATH之后系统才能在你敲mysql的时候知道去哪个目录找程序。可以理解成给系统一本地址簿之前你得报完整门牌号现在报个名字它就自己翻本子找过去了。这里要配的其实有两个变量一个是MYSQL_HOME也有人叫MYSQL_HOME或MYSQL56_HOME指向程序根目录另一个是往PATH里追加%MYSQL_HOME%\bin。为什么多此一举搞个中间变量因为将来升级版本或者换目录只需要改MYSQL_HOME一处PATH不用动。要是直接把绝对路径写死进PATH换版本时得重新翻一遍。4.2 图形界面配置的标准流程这是最稳妥的方式推荐所有人在第一次装的时候都用这个。第一步右键“此电脑”选“属性”进入“关于”页面找到右侧的“高级系统设置”。点进去会弹出“系统属性”对话框。第二步在“高级”选项卡点击“环境变量”按钮。这时候会看到上下两个区域上面是用户变量只对当前用户生效下面是系统变量对所有用户生效。装数据库建议配在系统变量里避免换个 Windows 账号就找不到命令。第三步在系统变量区域点“新建”。变量名填MYSQL_HOME变量值填C:\mysql\mysql-5.6.51-winx64。注意这里填到程序根目录为止不要带\bin也不要带结尾的反斜杠。很多人在这里多填了一层结果路径拼出来是...\winx64\\bin\\bin自然找不到。第四步在系统变量列表里找到Path双击打开。在 Windows 10 和 Windows 11 上Path 是列表形式点右侧“新建”填入%MYSQL_HOME%\bin。注意是%MYSQL_HOME%加反斜杠加bin用百分号包裹变量名。第五步一路点“确定”关掉所有对话框。这里有个关键细节每一层都要点确定不能点右上角的叉。点叉等于取消前面改的全部作废。我见过好几次有人配了半天没生效就是因为最后一层点了叉。4.3 命令行配置方式适合批量部署如果你要一次配好几台机器或者写自动化脚本用手点太慢。命令行里有个setx命令可以改环境变量。:: 设置程序根目录/M 表示写入系统变量不加则写用户变量 setx MYSQL_HOME C:\mysql\mysql-5.6.51-winx64 /M :: 把 bin 目录追加到 Path setx Path %Path%;%MYSQL_HOME%\bin /M这两条命令能用但必须知道它的三个陷阱不知道的话后果很严重。陷阱一setx会把%Path%立即展开成当前的实际值再写回去。如果当前Path里有%SystemRoot%这类变量引用展开后就变成硬编码的C:\Windows虽然功能上不影响但可读性变差后期维护的人可能会困惑。陷阱二setx写入的值有长度限制旧版本 Windows 上是 1024 字符。如果你的Path本来就长装过 VS、Python、Node、JDK 的机器基本都是几百上千字符这条命令可能把Path截断导致其他软件全部失效。这是最容易造成事故的一条。陷阱三setx修改的是注册表里的持久值对已经打开的窗口和进程无效。所以改完之后必须重新开一个命令行窗口才能看到效果。如果要脚本化写入Path我更推荐用 PowerShell 直接操作注册表并且做去重和长度检查$old [Environment]::GetEnvironmentVariable(Path, Machine) $add %MYSQL_HOME%\bin if ($old -notlike *$add*) { [Environment]::SetEnvironmentVariable(Path, $old;$add, Machine) }先判断是否已存在再追加避免重复执行时把同一段路径塞进去十几遍。4.4 验证配置是否生效的四种方式改完环境变量一定要新开一个命令行窗口在旧窗口里验证是自欺欺人因为旧进程的环境变量在启动那一刻就固定了。新窗口里依次验证:: 1. 看变量本身有没有写进去 echo %MYSQL_HOME% :: 2. 看系统能不能定位到可执行文件 where mysql where mysqld :: 3. 看客户端版本 mysql --version :: 4. 看服务端版本 mysqld --versionwhere这个命令比mysql --version更能说明问题因为它直接告诉你系统是在哪个目录找到的程序。如果输出了C:\mysql\mysql-5.6.51-winx64\bin\mysql.exe说明配置到位。如果提示“信息: 用提供的模式无法找到文件”那就回去检查路径有没有写错、bin是不是漏了、有没有新开窗口。mysql --version在 5.6 上会输出类似mysql Ver 14.14 Distrib 5.6.51, for Win64 (x86_64)的内容。看到这一行环境变量这一关就算过了。5. 初始化数据目录、写 my.ini、注册 Windows 服务5.1 为什么 5.6 没有 mysqld --initialize如果你从 5.7 或 8.0 过来会发现那几个版本初始化数据目录用的是mysqld --initialize或mysqld --initialize-insecure。这套命令是 5.7.6 才引入的5.6 里根本不存在。在 5.6 上初始化数据目录要用mysql_install_db.exeWindows或者scripts/mysql_install_db类 Unix 上的 Perl 脚本。这个工具做的事情包括创建data目录、建立mysql和performance_schema系统库、生成 root 账号、写入授权表。用错命令的话要么提示unknown option --initialize要么就是在data目录里生成了半成品后面各种异常。注意如果data目录已经被错误的方式搞出了一堆文件先整个删掉重新来。不要在污染过的数据目录上二次初始化5.6 的初始化脚本不会帮你清理残留文件会导致奇怪的问题。5.2 手写 my.ini参数取值要有依据初始化之前先把my.ini准备好这样初始化和后续运行用的就是同一套参数避免字符集前后不一致。在程序根目录C:\mysql\mysql-5.6.51-winx64\下新建文本文件命名为my.ini不是my.ini.txt注意把文件扩展名显示打开。内容如下[client] default-character-set utf8mb4 port 3306 [mysql] default-character-set utf8mb4 [mysqld] basedir C:/mysql/mysql-5.6.51-winx64 datadir C:/mysql/mysql-5.6.51-winx64/data port 3306 character-set-server utf8mb4 collation-server utf8mb4_general_ci skip-character-set-client-handshake lower_case_table_names 1 sql_mode NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES default-time-zone 08:00 max_allowed_packet 64M max_connections 300 innodb_file_per_table ON innodb_file_format Barracuda innodb_large_prefix ON innodb_buffer_pool_size 1G innodb_log_file_size 256M innodb_flush_log_at_trx_commit 2 log-error C:/mysql/mysql-5.6.51-winx64/data/mysql-error.log slow_query_log 1 long_query_time 2下面挑几个关键参数讲讲为什么这么取值。innodb_buffer_pool_size是 InnoDB 最核心的性能参数相当于数据库自己的内存缓存池数据页读写都先经过它。经验值取物理内存的 50% 到 70%这是数据库独占整台机器时的做法。开发机一般 8 GB 或 16 GB 内存还要跑 IDE 和各种服务所以我这条配的是 1 GB。如果是整机数据库服务器32 GB 内存配 20 GB 是合理的。innodb_log_file_size决定 redo 日志文件单个大小5.6.3 之后的默认值是 48 MB。往大了调能减少检查点刷新频率提升写入吞吐但崩溃恢复时间会变长。开发环境给 256 MB 足够。注意这个参数修改后重启才生效而且在 5.6 上直接改大小可能导致启动报错稳妥做法是先干净关闭服务删掉data目录下的ib_logfile0和ib_logfile1再启动让它重建。innodb_flush_log_at_trx_commit 2表示每秒刷一次日志到磁盘而不是每次事务提交都刷。这个设置在开发机上能明显提升批量导入速度代价是极端情况下操作系统崩溃而非进程崩溃可能丢一两秒的数据。生产环境的库要设成 1别学这条。innodb_file_format Barracuda加innodb_large_prefix ON是解决索引长度问题的关键组合下一章会详细算。lower_case_table_names 1表示表名统一转成小写存储、比较时不区分大小写。Windows 上默认就是 1Linux 上默认是 0。把这个值写死成 1好处是本地开发和线上 Linux 的行为一致避免本地跑通、上线报“表不存在”的经典事故。反过来说如果你线上就是 Linux 且表名有大写那这里就不能设 1。default-time-zone用偏移量格式08:00而不是Asia/Shanghai。原因是 5.6 在 Windows 上没有mysql_tzinfo_to_sql这个工具来生成命名时区表直接用名字会报Unknown or incorrect time zone。5.3 执行初始化并注册服务my.ini准备好之后用管理员身份打开命令行执行初始化C:\mysql\mysql-5.6.51-winx64\bin\mysql_install_db.exe ^ --defaults-fileC:\mysql\mysql-5.6.51-winx64\my.ini ^ --datadirC:\mysql\mysql-5.6.51-winx64\data ^ --passwordRoot123456三个参数的含义--defaults-file指定配置文件让初始化过程用上我们定义的字符集--datadir指定数据目录--password给 root 账号设初始密码。如果不给--passwordroot 密码就是空的登录时直接回车即可。执行成功的话最后会输出OK或者提示已创建系统表。这时候去data目录看应该能看到mysql、performance_schema两个文件夹以及ibdata1、ib_logfile0、ib_logfile1这些文件。接下来注册 Windows 服务让数据库能开机自启、也能用net start/stop管理C:\mysql\mysql-5.6.51-winx64\bin\mysqld.exe ^ --install MySQL56 ^ --defaults-fileC:\mysql\mysql-5.6.51-winx64\my.iniMySQL56是服务名可以自定但建议带上版本号方便将来和 8.0 共存时区分。--defaults-file必须带上而且要用绝对路径。原因是不带它的时候服务启动只能靠默认搜索顺序去找my.ini一旦机器上有多个 MySQL 或路径优先级变化服务就会读到别的配置文件表现就是“明明改了参数却不生效”。启动服务net start MySQL56看到“MySQL56 服务已经启动成功”说明整条链路通了。5.4 首次登录、改密码与开放远程登录mysql -u root -p输入刚才设置的密码。进去之后先确认字符集SHOW VARIABLES LIKE character_set_%; SHOW VARIABLES LIKE lower_case_table_names;如果character_set_server和character_set_database都是utf8mb4配置就对了。改密码用 5.6 的语法这套语法在 8.0 上已经不能用了SET PASSWORD FOR rootlocalhost PASSWORD(新的复杂密码); FLUSH PRIVILEGES;需要别的机器连过来时在 5.6 上是这么授权的GRANT ALL PRIVILEGES ON *.* TO root% IDENTIFIED BY 密码 WITH GRANT OPTION; FLUSH PRIVILEGES;注意上面这条是给开发测试环境图方便用的。生产环境不要用 root 开放远程也不要用%这种任意来源。正确做法是新建一个业务专用账号把来源限制到具体网段比如app192.168.10.%并且只授必要的库权限。关闭数据库有两种方式net stop MySQL56或者用客户端发指令mysqladmin -u root -p shutdown如果某天要卸载服务net stop MySQL56 C:\mysql\mysql-5.6.51-winx64\bin\mysqld.exe --remove MySQL56服务移除后程序目录和数据目录还在想彻底清理直接删目录。6. 那些年踩过的报错速查表加逐条拆解下面这张表是我自己遇到、也帮别人处理过的高频问题。先给速查再挑几条讲透。报错或现象根因解决方向mysql 不是内部或外部命令环境变量没配或窗口没重开检查 MYSQL_HOME 和 Path新开命令行ERROR 2003 (HY000): Cant connect to MySQL server on localhost (10061)服务没启动或端口不对net start MySQL56确认端口ERROR 1045 (28000): Access denied for user rootlocalhost密码错误或认证方式不匹配核对密码必要时走跳过授权表流程ERROR 1071: Specified key was too longutf8mb4 下索引超过 767 字节开 large_prefix或缩短索引列ERROR 1366: Incorrect string value连接字符集不是 utf8mb4检查 ini 与客户端编码服务启动报1067: 进程意外终止配置参数错误或数据目录残留看 error log 定位具体参数Unknown or incorrect time zone用了命名时区但没时区表改用08:00偏移量服务名已存在上次卸载没清服务mysqld --remove 旧服务名Failed to create the data directory路径含中文或权限不足换纯英文路径用管理员运行8.0 驱动连接报时区错误驱动默认要求 serverTimezone连接串加serverTimezoneAsia/Shanghai表和字段大小写不一致lower_case_table_names 平台差异统一设为 1或规范命名6.1 ERROR 1071 索引过长算一笔账这个错误值得单独说因为它在 5.6 加 utf8mb4 的组合里出现频率极高。InnoDB 的索引前缀长度上限跟行格式和innodb_large_prefix有关。在COMPACT或REDUNDANT行格式下单个索引列的前缀上限是 767 字节打开Barracuda行格式加上innodb_large_prefix ON之后上限提升到 3072 字节。而 utf8mb4 每个字符最多占 4 个字节。所以767 字节 ÷ 4 字节/字符 ≈ 191 字符3072 字节 ÷ 4 字节/字符 768 字符这就是为什么很多教程告诉你“utf8mb4 下建索引的 VARCHAR 不要超过 191”。一旦你写VARCHAR(255)并加索引在没开 large_prefix 的情况下立刻报 1071。解决有三个层次。治标的是把索引列长度改到 191 以内比如VARCHAR(191)。治本的是在my.ini里加上innodb_file_format Barracuda和innodb_large_prefix ON建表时显式写ROW_FORMAT DYNAMIC这样 768 字符以内都能建索引。第三个层次是把字段类型换成VARCHAR(255)加前缀索引比如KEY idx_name (name(191))牺牲部分索引精度换空间。注意innodb_large_prefix开启后只对新创建的表生效。已经建好的老表还是乐观锁行格式需要ALTER TABLE ... ROW_FORMATDYNAMIC重建才生效。6.2 ERROR 2003 连不上服务先别急着改配置看到10061这个数字九成是服务没起来不要一上来就怀疑端口和防火墙。排查顺序应该是先net start MySQL56看能不能启动启动失败的话直接去data目录下的错误日志里找原因日志路径就是my.ini里log-error配的那个文件日志里通常会明确写出是哪个参数不认识、哪个文件打不开。如果服务能起来但客户端还是连不上再检查端口是不是被别的程序占用netstat -ano | findstr :3306有输出说明 3306 已经被占用可能是之前装的 MySQL 没卸干净或者某个开发工具自带了一个嵌入式数据库。这种情况要么停掉占用进程要么把my.ini和连接串里的端口改成 3307。6.3 忘记 root 密码怎么办这是本地开发环境的高频事故。5.6 上的标准恢复流程是第一步停掉服务net stop MySQL56。第二步用跳过授权表的方式前台启动C:\mysql\mysql-5.6.51-winx64\bin\mysqld.exe ^ --defaults-fileC:\mysql\mysql-5.6.51-winx64\my.ini ^ --skip-grant-tables这个窗口不要关它会一直占着。第三步另开一个命令行直接mysql -u root免密登录然后改密码UPDATE mysql.user SET Password PASSWORD(新密码) WHERE User root; FLUSH PRIVILEGES;注意 5.6 的密码列名是Password不是 8.0 的authentication_string写错了会报“未知列”。第四步关掉刚才那个前台窗口正常启动服务net start MySQL56用新密码登录。注意--skip-grant-tables模式下任何人都能无密码连上所以整个过程要在本机完成别在开着这个参数的机器上暴露网络。改完密码立刻恢复正常启动。6.4 和 MySQL 8.0 共存时的注意事项不少人是机器上已经有 8.0再装一个 5.6 做兼容测试。这时候要注意三件事。服务名必须区分开5.6 叫MySQL568.0 叫MySQL80注册时都要带各自的--defaults-file。端口必须错开比如 5.6 用 33068.0 用 3307否则后启动的那个直接起不来。要特别注意客户端工具的驱动版本。DBeaver、Navicat 这类工具连 5.6 时驱动建议选mysql-connector-java 5.1.x比如 5.1.49兼容性最好。如果图省事用了 8.0.x 的驱动连接 5.6 时可能需要额外加serverTimezoneAsia/Shanghai不然会报时区相关的错误。反过来5.1.x 的驱动去连 8.0 会因为caching_sha2_password认证插件而失败提示Unable to load authentication plugin。一个工具里同时维护两种驱动配置或者干脆装两个客户端都是常见做法。7. 长期使用中的几条个人经验装完之后还有几件事想提醒一下都是实际维护中总结出来的。字符集这件事一开始就要统一。服务器端设utf8mb4建库时写DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci建表时再显式指定一遍客户端连接时确认SHOW VARIABLES LIKE character_set_client是utf8mb4。三层全都对齐才不会有乱码。我见过太多“存进去是问号、读出来是乱码”的案例追到最后都是某一层漏了。另外skip-character-set-client-handshake这个参数能强制客户端使用服务端字符集省心但有副作用——某些老客户端的编码假设会被打破加之前先在小范围验证。备份这块5.6 做逻辑备份主要靠mysqldump。开发环境常用的命令是mysqldump -u root -p --single-transaction --default-character-setutf8mb4 库名 backup.sql--single-transaction对 InnoDB 表能在不锁表的情况下拿到一致性快照--default-character-setutf8mb4保证导出文件编码正确导入时才不会出错。这个组合我用了很多年比直接mysqldump 库名 x.sql靠谱得多。关于版本替代方案如果你的目标只是“让老代码跑起来”而不是“必须用 5.6 这个二进制”可以先试试把 8.0 的sql_mode调成宽松模式去掉ONLY_FULL_GROUP_BY和STRICT_TRANS_TABLES很多老 SQL 就能直接跑。实在不行再退到 5.6。另外用容器镜像跑一个 5.6 实例也是常见做法隔离性好、删起来干净适合临时验证场景但同样不要把它当生产库用。最后分享一个日常省事的小技巧把启动、停止、登录这三条命令写成三个.bat文件放在桌面内容就一行net start MySQL56之类。虽然看着简陋但每天开关库能省下不少敲字时间。等哪天你同时在维护 5.6、5.7、8.0 三个版本的时候会庆幸自己做了这件事。
返回列表