12下一页
返回列表 发帖
查看: 523|回复: 11

[BUG提交] discuz! X5.0 的数据库导入问题

13

主题

84

回帖

2

粉丝

渐入佳境

贡献
0 点
金币
5 个
产品版本
X5.0+
发表于 2026-3-28 08:48:06 |福建| 查看全部 |阅读模式
本帖最后由 iwuyou 于 2026-3-29 11:23 编辑

已解决,官方升级程序的BUG,新增6个表的fields json 值时,没有设置默认值为{},造成实际数据值为空,影响后续在高版本数据库中正常使用。

如果服务器不升级数据库,可能不会有影响。
如果要升级高版本数据库,可以用以下方式先行修复,以免数据库在后续升级时或导入数据时,这6个表可能出错而无法导入。
  1. -- 对原库进行修复

  2. -- 批量修复表结构,设置默认值为{}
  3. ALTER TABLE pre_common_member_profile_archive MODIFY COLUMN fields json NOT NULL DEFAULT '{}';
  4. ALTER TABLE pre_common_member_profile_history MODIFY COLUMN fields json NOT NULL DEFAULT '{}';
  5. ALTER TABLE pre_common_usergroup_field MODIFY COLUMN fields json NOT NULL DEFAULT '{}';
  6. ALTER TABLE pre_forum_forumfield MODIFY COLUMN fields json NOT NULL DEFAULT '{}';
  7. ALTER TABLE pre_home_docomment MODIFY COLUMN fields json NOT NULL DEFAULT '{}';
  8. ALTER TABLE pre_home_doing MODIFY COLUMN fields json NOT NULL DEFAULT '{}';

  9. -- 批量修复空值 '' 为合法JSON {}
  10. UPDATE pre_common_member_profile_archive SET fields = '{}' WHERE fields = '' OR fields IS NULL;
  11. UPDATE pre_common_member_profile_history SET fields = '{}' WHERE fields = '' OR fields IS NULL;
  12. UPDATE pre_common_usergroup_field        SET fields = '{}' WHERE fields = '' OR fields IS NULL;
  13. UPDATE pre_forum_forumfield              SET fields = '{}' WHERE fields = '' OR fields IS NULL;
  14. UPDATE pre_home_docomment                SET fields = '{}' WHERE fields = '' OR fields IS NULL;
  15. UPDATE pre_home_doing                    SET fields = '{}' WHERE fields = '' OR fields IS NULL;
复制代码



------------
这两天在mariadb 10.11.16 导出数据库后,在mariadb 11.8.6 测试导入数据,会出现大量类似于以下的提示:
ERROR 4025 (23000) at line 7636520: CONSTRAINT `pre_common_member_profile_archive.fields` failed for `bbs`.`pre_common_member_profile_archive`。
应该是外键有问题,是不是官方要使用更严格的规范数据库内容?

回复

使用道具 举报

98

主题

658

回帖

23

粉丝

管理员

贡献
31 点
金币
75 个
产品版本
X5.0+
发表于 2026-3-28 08:49:14 |北京| 查看全部
MYSQL兼容列表里没有说支持这个数据库
回复

使用道具 举报

13

主题

84

回帖

2

粉丝

渐入佳境

贡献
0 点
金币
5 个
产品版本
X5.0+
 楼主| 发表于 2026-3-28 09:00:48 |福建| 查看全部
monkeye 发表于 2026-3-28 08:49
MYSQL兼容列表里没有说支持这个数据库

我现在用的是fedora server 43,用的是mariadb 10.11.16,使用discuz! X5.0正常。
下一个版本fedora server 44(下个月出正式版),将使用mariadb 11.8.6以上的版本,目前无法导入数据库,会报错。
mariadb 11.8.6 采用更严格的规范,导致无法正常导入。
回复

使用道具 举报

46

主题

6823

回帖

19

粉丝

应用开发者

贡献
673 点
金币
1461 个
产品版本
X5.0+
QQ
发表于 2026-3-28 09:26:56 |浙江| 查看全部
iwuyou 发表于 2026-3-28 09:00
我现在用的是fedora server 43,用的是mariadb 10.11.16,使用discuz! X5.0正常。
下一个版本fedora serv ...

mariadb是基于mysql的,DZ的基础逻辑是mysql,mariadb太高的版本暂时不能百分百保证。建议维持正常和mysql完全兼容的版本
回复

使用道具 举报

6

主题

1712

回帖

4

粉丝

应用开发者

贡献
49 点
金币
180 个
产品版本
X5.0+
QQ
发表于 2026-3-28 10:06:23 |浙江| 查看全部
使用mysql数据库版本会兼容性好一点
回复

使用道具 举报

13

主题

84

回帖

2

粉丝

渐入佳境

贡献
0 点
金币
5 个
产品版本
X5.0+
 楼主| 发表于 2026-3-28 17:08:52 |福建| 查看全部
fedora server 系统版本升级很方便,可以直接升级。
mysql 出了商业版本以后,很多linux系统默认改用mariadb,不用mysql,怕mysql 全面商业化。
回复

使用道具 举报

46

主题

6823

回帖

19

粉丝

应用开发者

贡献
673 点
金币
1461 个
产品版本
X5.0+
QQ
发表于 2026-3-28 17:17:47 |浙江| 查看全部
iwuyou 发表于 2026-3-28 17:08
fedora server 系统版本升级很方便,可以直接升级。
mysql 出了商业版本以后,很多linux系统默认改用mariad ...

仅代表你个人意见,你要这么说,那一大堆数据库等着接,话题就没完了
回复

使用道具 举报

13

主题

84

回帖

2

粉丝

渐入佳境

贡献
0 点
金币
5 个
产品版本
X5.0+
 楼主| 发表于 2026-3-28 20:49:19 |福建| 查看全部
目前可能导入出错的原因,在于字段做了检查限制:
CHECK (json_valid(`fields`)

如 pre_common_member_profile_archive 这个表中,有如下字段定义:

  1. `fields` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL CHECK (json_valid(`fields`)),
复制代码


重点是里面的 CHECK (json_valid(`fields`),对数据值进行了限制。
而实际数据表中,fields 有大量空字符串,是不合格的值。应该是在重新插入到高版本数据库,CHECK (json_valid(`fields`) 触发了BUG。

修复办法:
sed -i 's/ CHECK (json_valid(`fields`))//g' /backup/bbs.sql

或者导出前对数据库中相关表,有要求使用CHECK (json_valid(`fields`)的字段空值,进行重新赋给合格的值{}。

@monkeye
回复

使用道具 举报

13

主题

84

回帖

2

粉丝

渐入佳境

贡献
0 点
金币
5 个
产品版本
X5.0+
 楼主| 发表于 2026-3-28 21:15:36 |福建| 查看全部
待测试以下代码修复后的效果:

  1. USE bbs;
  2. SET FOREIGN_KEY_CHECKS=0;
  3. SET SQL_SAFE_UPDATES=0;

  4. -- 批量修复空值 '' 为合法JSON {}
  5. UPDATE pre_common_member_profile_archive SET fields = '{}' WHERE fields = '' OR fields IS NULL;
  6. UPDATE pre_common_member_profile_history SET fields = '{}' WHERE fields = '' OR fields IS NULL;
  7. UPDATE pre_common_usergroup_field        SET fields = '{}' WHERE fields = '' OR fields IS NULL;
  8. UPDATE pre_forum_forumfield              SET fields = '{}' WHERE fields = '' OR fields IS NULL;
  9. UPDATE pre_home_docomment                SET fields = '{}' WHERE fields = '' OR fields IS NULL;
  10. UPDATE pre_home_doing                    SET fields = '{}' WHERE fields = '' OR fields IS NULL;

  11. SET SQL_SAFE_UPDATES=1;
  12. SET FOREIGN_KEY_CHECKS=1;

  13. SELECT '✅ 6张表全部修复完成!所有空值已变为合法JSON' AS result;
复制代码
回复

使用道具 举报

13

主题

84

回帖

2

粉丝

渐入佳境

贡献
0 点
金币
5 个
产品版本
X5.0+
 楼主| 发表于 2026-3-29 06:45:09 |福建| 查看全部
经测试,用以下代码修复原有的论坛,再导出的数据,可以成功导入高版本 mariadb 11.8.6
也就是说,对要求使用json格式的字段,应该修改其值为{},以防后续高版本数据库的严格检查。
  1. USE bbs;

  2. -- 批量修复空值 '' 为合法JSON {}
  3. UPDATE pre_common_member_profile_archive SET fields = '{}' WHERE fields = '' OR fields IS NULL;
  4. UPDATE pre_common_member_profile_history SET fields = '{}' WHERE fields = '' OR fields IS NULL;
  5. UPDATE pre_common_usergroup_field        SET fields = '{}' WHERE fields = '' OR fields IS NULL;
  6. UPDATE pre_forum_forumfield              SET fields = '{}' WHERE fields = '' OR fields IS NULL;
  7. UPDATE pre_home_docomment                SET fields = '{}' WHERE fields = '' OR fields IS NULL;
  8. UPDATE pre_home_doing                    SET fields = '{}' WHERE fields = '' OR fields IS NULL;

复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 关注公众号
  • 有偿服务微信
  • 有偿服务QQ

手机版|小黑屋|Discuz! 官方交流社区 ( 皖ICP备16010102号 |皖公网安备34010302002376号 )|网站地图|star

GMT+8, 2026-5-15 02:47 , Processed in 0.045264 second(s), 11 queries , Redis On.

Powered by Discuz! X5.0 Licensed

© 2001-2026 Discuz! Team.

关灯 在本版发帖
有偿服务QQ
有偿服务微信
返回顶部
快速回复 返回顶部 返回列表