船说 CMS 支持 mysql8.0 吗
学完这篇你能判断自己手上的船说 CMS 能不能直接换到 MySQL 8.0,并且知道报错时该改哪几个参数。
第一步:先确认官方声明的版本范围
这一步要做的是找到船说 CMS 官方给的环境要求,做完你能知道作者到底测过哪些 MySQL 版本。
解压安装包,根目录下找 readme.txt(部分版本叫 安装说明.txt),打开看「环境要求」一节,里面通常写的是 PHP 版本和 MySQL 版本下限,比如「MySQL 5.1+」。这个「5.1+」只写了下限,没有写上上限,所以它既不能证明支持 8.0,也不能证明不支持。
后台里也能看到实际运行环境:登录后台 → 顶部「系统」→「系统信息」,右侧「服务器信息」卡片会列出当前 PHP 版本、MySQL 版本,同一区域有「程序版本」。
注意:官方只测过 MySQL 5.x,说明的是「开发时没在 8.0 上验证」,不等于跑不起来。反过来,别人说能跑,也不代表你的服务器配置能跑。
第二步:在测试环境实跑一遍
这一步要用一份数据副本在 MySQL 8.0 上完整走一遍安装流程,做完你能拿到确定的答案,而不是猜测。
- 准备一个 MySQL 8.0(8.0.11 以上均可,建议用 8.0.3x 系列)。
- 建库:
CREATE DATABASE chuanshuo DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; - 建专用账号:
CREATE USER 'cs_user'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密码';再执行GRANT ALL ON chuanshuo.* TO 'cs_user'@'localhost'; - 浏览器打开
http://你的域名/install/,按向导填库名、账号、密码,导入官方install.sql。 - 装完后做三件事:登录后台、发布一篇内容、打开前台首页。
三件都正常,就是能用;哪一步报错,看第三步和第四步。
第三步:报错 Authentication plugin 'caching_sha2_password'
MySQL 8.0 把默认认证插件从 mysql_native_password 换成了 caching_sha2_password,老版本 PHP 的 mysqlnd 驱动不认这个插件,连接时会报 2054 或上面这条错误。
确认方式:报错信息里出现 caching_sha2_password 就是这个原因。两种改法选一种:
- 改账号(推荐,影响面小):
ALTER USER 'cs_user'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密码';然后FLUSH PRIVILEGES; - 改服务端默认值:编辑
my.cnf(Linux,一般在/etc/my.cnf)或my.ini(Windows 的 MySQL 安装目录),在[mysqld]段加一行default_authentication_plugin=mysql_native_password,保存后重启 MySQL 服务。
注意:PHP 7.4 及以上、且使用 mysqlnd 驱动时原生就支持 caching_sha2_password,不需要改。先在后台上一步的「系统信息」里看清 PHP 版本,再决定动不动 MySQL 配置。
第四步:报 SQL 语法错或 ONLY_FULL_GROUP_BY
MySQL 8.0 默认 sql_mode 包含 ONLY_FULL_GROUP_BY、STRICT_TRANS_TABLES、NO_ZERO_DATE,CMS 里的分页和统计查询容易撞上。
查当前值:命令行执行 SELECT @@sql_mode;,或在 phpMyAdmin 首页点「变量」标签搜索 sql_mode。
临时改(重启失效):SET GLOBAL sql_mode='STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION';
永久改:在 my.cnf 的 [mysqld] 段加一行 sql_mode=STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION,重启 MySQL。
注意:关掉
NO_ZERO_DATE后,老数据里的0000-00-00才能正常读写。别把 sql_mode 直接设成空字符串,那会把真正的问题一起掩盖掉。
第五步:处理排序规则和保留字
如果导入时提示 Unknown collation: 'utf8mb4_0900_ai_ci',说明这份 sql 是从 8.0 导出的、往低版本导。把文件里的 utf8mb4_0900_ai_ci 全部替换成 utf8mb4_general_ci 再导入。反过来从 5.x 往 8.0 导,一般不会有这个问题。
如果提示某个字段名是保留字(如 rank、groups、system),需要给字段加反引号或改名,这类要改程序源码里的 SQL 语句,工作量较大,属于少数情况。
小结
- 船说 CMS 官方只给出 MySQL 版本下限,8.0 未明确列入支持范围,能不能用要靠实测。
- 换库前先在测试环境走完「安装 → 登录后台 → 发内容」三步。
- 最常见的坑是认证插件
caching_sha2_password,用ALTER USER ... IDENTIFIED WITH mysql_native_password解决。 - 第二大类报错来自 sql_mode 的
ONLY_FULL_GROUP_BY和NO_ZERO_DATE。 - 生产库操作前先备份,别在原库上直接试。
原文链接:https://www.gj0.com/thread-904.html
转载请注明出处并保留本声明;内容仅代表作者观点,与本站立场无关。若本文涉嫌侵权,请联系本站处理。