船说 CMSmysql5.6 可以正常运行吗
看完这篇你能判断手里的船说CMS 到底能不能装在 MySQL 5.6 上,以及装不上时报错该怎么改。先给结论:多数版本的船说CMS 在 MySQL 5.6 上可以跑起来,但不是解压就能装——通常要改三处:字符集、索引长度限制、sql_mode。如果你的安装包里出现了 json 字段类型,那 5.6 直接无解,必须换 5.7 及以上。
第一步:确认你的版本和它的真实要求
这一步要搞清楚"官方说要求 5.7"是不是硬要求,拿到判断依据再动手。
先看版本号:打开源码根目录的 application/ 或 app/ 下的 config.php、database.php,以及根目录的 README.md、install/ 里的说明文件。多数船说CMS 的安装说明写的是 PHP 7.0+ / MySQL 5.7+,其中 5.7 主要就是因为字符集默认走 utf8mb4。
再确认服务器上的实际版本,命令行执行:
mysql -uroot -p -e "SELECT VERSION();"
宝塔面板用户走:软件商店 → 已安装 → MySQL 5.6 → 设置,首页就能看到版本号。只要大于 5.5.3,utf8mb4 本身就是支持的,问题不在"能不能存",而在"索引能不能建"。
第二步:翻 SQL 文件,找 5.7 专属写法
这一步决定你后面是"改配置"还是"换数据库"。
在源码根目录执行:
grep -rniE "json|utf8mb4|CURRENT_TIMESTAMP\(|ROW_FORMAT" ./install/*.sql | head -50
对照结果判断:
- 只搜到
utf8mb4→ 能救,往下走第三步。 - 搜到
json类型字段(形如 `xxxjson DEFAULT NULL)→ MySQL 5.6 不支持 JSON 数据类型,只能手工把它改成text`,或者直接升级到 MySQL 5.7。 - 搜到
DEFAULT CURRENT_TIMESTAMP用在多个字段上 → 5.6 是支持的(5.5 才只允许一个),不用管。
注意:
grep的路径按你实际解压后的目录调整,有的包把 SQL 放在data/、sql/或install/data/下。
第三步:改 MySQL 5.6 的四个关键参数
这一步解决的是 5.6 的 InnoDB 索引前缀只有 767 字节、装 utf8mb4 时 varchar(255) 索引直接超长的老问题。
编辑 my.cnf(宝塔用户走 软件商店 → MySQL 5.6 → 设置 → 配置修改,改完点"重载配置";命令行用户改 /etc/my.cnf 后执行 service mysql restart):
[mysqld]
innodb_file_per_table = 1
innodb_file_format = Barracuda
innodb_large_prefix = ON
default-storage-engine = InnoDB
character-set-server = utf8
collation-server = utf8_general_ci
sql_mode = NO_ENGINE_SUBSTITUTION
其中 innodb_large_prefix = ON 把索引前缀上限提到 3072 字节,innodb_file_format = Barracuda 是它的前置条件,两者必须同时有。
如果不想动数据库全局配置,退一步的办法是把 SQL 文件里的 utf8mb4 全部替换成 utf8、utf8mb4_general_ci 替换成 utf8_general_ci,再把 varchar(255) 的索引字段改成 varchar(191)。
注意:
innodb_large_prefix生效的前提是建表时用ROW_FORMAT=DYNAMIC。5.6 里默认行格式是 COMPACT,必要时在 SQL 文件的ENGINE=InnoDB后面补上ROW_FORMAT=DYNAMIC。
第四步:对号入座处理安装报错
这一步是把上面几步落到具体报错上。
报 #1071 - Specified key was too long; max key length is 767 bytes
→ 第三步的参数没生效,重载配置后重新导入;或者按上面的退一步方案改 SQL。
报 #1067 - Invalid default value for 'create_time'
→ sql_mode 太严。在 phpMyAdmin 里先执行:
SET SESSION sql_mode = 'NO_ENGINE_SUBSTITUTION';
再导入 SQL。命令行导入则用:
mysql -uroot -p --default-character-set=utf8 你的数据库名 < install.sql
报 #1064 且提示 json 附近语法错误
→ 确认是 JSON 字段,5.6 无法兼容,换 5.7。
装完页面中文变问号
→ 检查 database.php 里的 charset 是否和库的字符集一致,统一成 utf8 或统一成 utf8mb4,别一半一半。
第五步:想清楚要不要继续用 5.6
MySQL 5.6 官方已经停止支持,没有安全更新,而这个 CMS 后续版本大概率会往 5.7/8.0 走。如果你的服务器允许,直接上 MySQL 5.7 或 8.0,上面第二到第四步的坑一个都不会遇到;只有在服务器是老旧环境、动不了数据库版本时,才值得按本文去改 5.6。
小结
- 船说CMS 在 MySQL 5.6 上通常能跑,前提是 SQL 文件里没有
json字段类型。 - 先
SELECT VERSION();确认版本,再用grep扫 SQL 文件里的json/utf8mb4,判断是改配置还是换数据库。 - 5.6 三个必调项:
innodb_large_prefix = ON、innodb_file_format = Barracuda、sql_mode = NO_ENGINE_SUBSTITUTION。 - 索引超长的报错是
#1071,时间字段报错是#1067,UTF-8 问题优先查连接字符集和库字符集是否统一。 - 能升 5.7/8.0 就别耗在 5.6 上,5.6 已停止安全更新。
原文链接:https://www.gj0.com/thread-909.html
转载请注明出处并保留本声明;内容仅代表作者观点,与本站立场无关。若本文涉嫌侵权,请联系本站处理。