船说 CMS 数据库报错如何修复

juming
juming 正式会员超兽战士
发布于 2026-10-07 08:09 ·0 浏览 ·0 回复

学完这篇,你能独立定位并修复船说 CMS 最常见的几类数据库报错,不用再对着白屏干着急。

船说 CMS 跑在 ThinkPHP 上,绝大多数「数据库报错」其实就三类:连不上、表不对、编码/模式不兼容。下面按排查顺序来。

第一步:把报错原文找出来,别靠猜

这一步的目标是拿到完整错误信息——没有它,后面全是瞎试。

如果页面直接显示报错(白屏 + 一堆英文),先记下错误码,常见的有 1045、1049、1146、2002。如果页面只显示「系统错误」之类的模糊提示,去网站根目录打开 application/config.php,把 'app_debug' => false 改成 true,保存后刷新页面,详细报错就会显示出来。

同时去 runtime/log/ 目录,里面按日期命名,比如 20240612.log,用记事本打开,搜索 SQLSTATE 或 Error,能看到带 SQL 语句的完整记录。

注意:修完问题后记得把 app_debug 改回 false,开着它等于把数据库结构暴露给所有人。

第二步:核对数据库连接配置

这一步解决的是 1045、1049、2002 这类「连不上」的报错,改完就能正常连库。

用记事本或 VS Code 打开 application/database.php(部分版本在 config/database.php),重点看四项:

'hostname' => '127.0.0.1',
'database' => 'chuanshuo',
'username' => 'root',
'password' => '你的密码',
'hostport' => '3306',
  • 1045 Access denied → 用户名或密码错了。用 phpMyAdmin 或命令行 mysql -uroot -p 验一遍,能登进去就用同样的账号密码。
  • 1049 Unknown database → 库名写错了,或者数据库根本没建。登录 phpMyAdmin,点左上角「新建」,数据库名填 chuanshuo,排序规则选 utf8mb4_general_ci,点「创建」。
  • 2002 Connection refused → MySQL 没启动,或端口不对。Windows 下按 Win+R 输入 services.msc,找到 MySQL80 服务,右键「启动」。
  • 报 could not find driver → PHP 的 pdo_mysql 扩展没开。打开 php.ini,把 ;extension=pdo_mysql 前面的分号删掉,重启 Apache/Nginx。

注意:hostname 建议写 127.0.0.1 而不是 localhost,后者在部分环境下会走 socket 连接,容易报 2002。

第三步:处理「表不存在」和字段错误

这一步解决 1146、1054 这类报错,通常发生在刚部署或升级之后。

1146 Table 'xxx.xxx' doesn't exist 意思是数据表丢了。船说 CMS 的安装包里一般带一个 .sql 文件(如 chuanshuo.sql 或 install/data/install.sql)。

用 phpMyAdmin 导入:左侧点中你的数据库 → 顶部点「导入」选项卡 → 点「选择文件」按钮选中 sql 文件 → 下方「字符集」选 utf-8 → 点右下角「执行」。

用 Navicat 的话:右键数据库 → 「运行 SQL 文件」 → 选中 sql 文件 → 编码选 65001 (UTF-8) → 点「开始」。

如果只是升级后少了某几个字段,别全库导入(会覆盖数据),对照新版安装包的 sql 文件,把缺失的那几条 ALTER TABLE 语句单独复制到 phpMyAdmin 的「SQL」选项卡里执行。

第四步:清缓存,最容易被忽略的一步

改完配置还报同样的错,八成是旧缓存没清。

进入网站根目录的 runtime 文件夹,删除 cache、temp、log 三个子目录里面的全部内容(目录本身保留)。如果权限允许,直接把 runtime 整个删掉也行,程序会自动重建。

注意:Linux 服务器上删完要确认 runtime 目录权限是 755、属主是 web 用户(如 www-data),否则程序写不进缓存,会报新的错。

第五步:MySQL 5.7 的 ONLY_FULL_GROUP_BY 报错

如果你看到 1055 ... which is not in GROUP BY clause,这是 MySQL 5.7 默认开了严格模式。

编辑 MySQL 配置文件:Windows 是 my.ini,Linux 是 /etc/my.cnf,在 [mysqld] 段落下面加一行:

sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

保存后重启 MySQL 服务(Windows 在 services.msc 里重启 MySQL80,Linux 执行 systemctl restart mysqld)。

注意:改配置前先复制一份原文件备份,写错一个字符 MySQL 就起不来了。

小结

  • 先拿完整报错:开 app_debug、看 runtime/log/ 里的日志文件。
  • 连不上查 application/database.php 的账号密码库名端口,外加 pdo_mysql 扩展。
  • 表不存在就导入 sql 文件,字符集选 utf-8,别在已有数据上全量覆盖。
  • 改完配置必须清 runtime 缓存,否则改动不生效。
  • MySQL 5.7 的 1055 报错改 my.ini / my.cnf 的 sql_mode 后重启服务。
版权声明:本文来自 GJ论坛《船说 CMS 数据库报错如何修复》
原文链接:https://www.gj0.com/thread-176.html
转载请注明出处并保留本声明;内容仅代表作者观点,与本站立场无关。若本文涉嫌侵权,请联系本站处理。

全部回复 0

还没有回复,来抢沙发~