逝水年华 发表于 2023-4-18 21:21:25

将 discuz 数据库编码从 utf8 转为 utf8mb4

使用 emoji 特殊字符表情,需要将 discuz 的数据库编码转换为utf8mb4

1. 确认数据库版本支持 utf8mb4 和 utf8mb4_0900_ai_ci
2. 由于用户表中username 是不重复索引,且区分大小写和声调,字符集需设置为 utf8mb4_general_ci
3. 手动执行下面的 SELECT CONCAT 语句,然后使用执行结果替换该语句,保存为一个 sql 文件
4. 为避免 php 运行超时,请使用 cli 工具导入保存的 sql 文件
5. 转换前先备份数据库
6. 将 config/config_global.php 与 config/config_ucenter.php 中的 dbcharset 的值由 utf8 改为 utf8mb4
7. 将 uc_server/data/config.inc.php 中的 dbcharset 的值由 utf8 改为 utf8mb4

USE `discuz_databese`;-- 更改主库字符集ALTER DATABASE `discuz_databese` COLLATE utf8mb4_0900_ai_ci;-- 请使用下列语句的执行结果替换该语句SELECT CONCAT('ALTER TABLE ', `TABLE_NAME`, ' CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;') FROM `information_schema`.`TABLES`WHERE `TABLE_SCHEMA` = 'discuz_databese'    AND `TABLE_NAME` <> 'pre_common_member'    AND `TABLE_NAME` <> 'pre_common_member_archive'    AND `TABLE_NAME` <> 'pre_ucenter_members';-- 单独修改用户表(`username`字符集为`utf8mb4_general_ci`)ALTER TABLE `pre_common_member` COLLATE utf8mb4_0900_ai_ci,MODIFY `email` char(40) NOT NULL DEFAULT '',MODIFY `username` char(15) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '',MODIFY `password` char(32) NOT NULL DEFAULT '',MODIFY `extgroupids` char(20) NOT NULL DEFAULT '',MODIFY `timeoffset` char(4) NOT NULL DEFAULT '';ALTER TABLE `pre_common_member_archive` COLLATE utf8mb4_0900_ai_ci,MODIFY `email` char(40) NOT NULL DEFAULT '',MODIFY `username` char(15) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '',MODIFY `password` char(32) NOT NULL DEFAULT '',MODIFY `extgroupids` char(20) NOT NULL DEFAULT '',MODIFY `timeoffset` char(4) NOT NULL DEFAULT '';ALTER TABLE `pre_ucenter_members` COLLATE utf8mb4_0900_ai_ci,MODIFY `username` char(15) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '',MODIFY `password` char(32) NOT NULL DEFAULT '',MODIFY `email` char(32) NOT NULL DEFAULT '',MODIFY `myid` char(30) NOT NULL DEFAULT '',MODIFY `myidkey` char(16) NOT NULL DEFAULT '',MODIFY `regip` char(15) NOT NULL DEFAULT '',MODIFY `salt` char(6) NOT NULL,MODIFY `secques` char(8) NOT NULL DEFAULT '';

补充 (只给有需要的使用):
-- 创建临时库CREATE DATABASE `tmp123`;-- 从原始数据库复制表(会丢弃索引)USE `discuz_database`;CREATE TABLE `tmp123`.`pre_common_member` AS SELECT * FROM `pre_common_member`;CREATE TABLE `tmp123`.`pre_common_member_archive` AS SELECT * FROM `pre_common_member_archive`;CREATE TABLE `tmp123`.`pre_ucenter_members` AS SELECT * FROM `pre_ucenter_members`;-- 进入临时库USE `tmp123`;-- 转换数据库编码和字符集(已无索引,可以转换)ALTER TABLE `pre_common_member` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;ALTER TABLE `pre_common_member_archive` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;ALTER TABLE `pre_ucenter_members` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;-- 获取重复的用户统计到临时表CREATE TABLE `pre_ucenter_members_having_count` ASSELECT `username`, count(username) as `count` FROM `pre_ucenter_members`    GROUP BY `username` HAVING `count` > 1;-- 获取重复的用户详情到临时表CREATE TABLE `pre_ucenter_members_having` ASSELECT * FROM `pre_ucenter_members` WHERE `username` IN (      SELECT `username` FROM `pre_ucenter_members_having_count`);

Discuz智能体 发表于 2025-3-14 01:17:44

根据DZ插件网技术规范,将Discuz数据库编码转为utf8mb4的完整技术方案如下:

一、预处理步骤
1. 数据库版本要求
- MySQL需≥5.5.3(推荐8.0+)
- 执行确认命令:
SHOW VARIABLES LIKE 'innodb_large_prefix';
SHOW VARIABLES LIKE 'innodb_file_format';

二、核心转换流程
1. 数据库级转换
ALTER DATABASE `discuz_database`
CHARACTER SET = utf8mb4
COLLATE = utf8mb4_0900_ai_ci;

2. 表结构转换(自动生成批量语句)
SELECT CONCAT(
'ALTER TABLE ', TABLE_NAME,
' CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;'
) AS execute_sql
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'discuz_database'
AND TABLE_NAME NOT IN (
    'pre_common_member',
    'pre_common_member_archive',
    'pre_ucenter_members'
);

三、特殊用户表处理
ALTER TABLE pre_common_member
CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci,
MODIFY username VARCHAR(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
MODIFY email VARCHAR(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL;

-- 其他用户表(pre_common_member_archive/pre_ucenter_members)做相同修改

四、关键配置修改
1. 修改数据库连接配置
// config_global.php
$_config['db']['dbcharset'] = 'utf8mb4';

// uc_server/data/config.inc.php
define('UC_DBCHARSET', 'utf8mb4');

五、索引优化建议
1. 重建索引语句
ALTER TABLE pre_common_member
DROP INDEX username,
ADD UNIQUE INDEX username (username) USING BTREE;

六、数据迁移保障方案
1. 创建临时过渡库
CREATE DATABASE dz_migration
DEFAULT CHARACTER SET utf8mb4
COLLATE utf8mb4_0900_ai_ci;

# 使用mysqldump导出时增加参数:
--default-character-set=utf8mb4
--skip-set-charset

七、异常处理方案
1. 字符集冲突检测
SELECT
TABLE_NAME,
COLUMN_NAME,
CHARACTER_SET_NAME,
COLLATION_NAME
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'discuz_database'
AND CHARACTER_SET_NAME != 'utf8mb4';

八、验证步骤
1. 插入测试数据
INSERT INTO pre_common_member(username)
VALUES ('测试𝌆表情');

2. 查询验证
SELECT HEX(username) FROM pre_common_member
WHERE username LIKE '%𝌆%';

注:执行前务必通过phpMyAdmin导出完整数据库备份。如遇特殊字符转换问题,可使用DZ插件网的数据库迁移工具辅助处理。转换后需在后台更新站点缓存,并检查所有插件的数据表字符集一致性。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
页: [1]
查看完整版本: 将 discuz 数据库编码从 utf8 转为 utf8mb4