
在Nextcloud 15或更高版本中,系统支持文件名或评论中使用4字节字符(比如emoji表情),但由于大多数用户是由Nextcloud旧版本升迁到新版本,数据库并没有更新相关设置。会导致【安全及设置警告】中提示”所使用的数据库为MySQL但没有对4字节字符的支持。为正确处理文件名或评论中使用的4字节字符(比如emoji表情),建议开启MySQL的4字节字符支持。“。

可通过开启MySQL的4字节字符解决问题,具体步骤如下:
在开启MySQL的4字节符前,先把当前Nextcloud数据库备份一下,以备不时之需。
执行如下命令,其中密码是数据库root用户的密码,数据库是Nextcloud的数据库,数据将备份到/var/tmp下,备份文件格式为gzip,备份存放目录及备份文件名称可自行设定。
mysqldump -uroot -p密码 数据库 | gzip > /var/tmp/data`date +%Y-%m-%d_%H%M%S`.sql.gz
查看/var/tmp,备份文件已生成。

1. 确认MySQL或MariaDB版本(下面以MariaDB为例)
ssh连接服务器,用数据库root用户进入MariaDB查询版本号
mysql -u root -p
此时会看到MariaDB版本号

或者进入MariaDB后,输入status,可查看更详细的信息。

2. 修改MySQL或MariaDB数据库InnoDB设置
a. MySQL 8.0或更高版本:
修改MySQL配置文件(一般存放于/etc/mysql目录下),在 [mysqld]下添加如下配置项。
[mysqld]
innodb_file_per_table = 1
b. 低于MySQL 8.0版本:
修改MySQL配置文件,在 [mysqld]下添加如下配置项。
[mysqld]
innodb_large_prefix = true
innodb_file_format = barracuda
innodb_file_per_table = 1
c. MariaDB 10.3或更高版本:
修改/etc/mysql/mariadb.conf.d/50-server.cnf配置文件, 在 [mysqld]下添加如下配置项。
[mysqld]
innodb_file_per_table = 1
d. MariaDB 10.2或更早版:(本事例中,MariaDB版本为10.1.38)
修改/etc/mysql/mariadb.conf.d/50-server.cnf配置文件, 在 [mysqld]下添加如下配置项。
[mysqld]
innodb_large_prefix = true
innodb_file_format = barracuda
innodb_file_per_table = 1

- 重启数据库服务。
service mysqld restart
3. 开启MySQL 4字节支持
a. MySQL:
- 数据库root用户登入MySQL。
mysql -u root -p
- 更改数据库字符集和排序规则 。
ALTER DATABASE nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
- 退出MySQL数据库。
exit
- 在Nextcloud的config.php中把mysql.utf8mb4设为true,进入Nextcloud网站目录,运行如下命令。
sudo -u www-data php occ config:system:set mysql.utf8mb4 --type boolean --value="true"
- 通过运行修复步骤将Nextcloud所有表转换为新的排序规则。
sudo -u www-data php occ maintenance:repair
- 等待完成。

完成后,再次刷新管理后台的【概览】页,相关警告提示消失。
b. MariaDB
- 数据库root用户登入MySQL
mysql -u root -p
- 查看Nextcloud数据库文件格式是否已更改为Barracuda,命令中“数据库名称”更换为你的Nextcloud数据库名称,记得保留后面的“%”符号。
SELECT NAME, SPACE, FILE_FORMAT FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME like "数据库名称%";

由上图看出文件格式为Antelope,因些我们必须对数据库文件格式进行转换。
- 创建批量转换SQL命令并执行转换
进入INFORMATION_SCHEMA数据库
USE INFORMATION_SCHEMA;
生成Nextcloud数据库的批量转换SQL命令,命令中“数据库名称”更改为你的Nextcloud数据库名称。
SELECT CONCAT("ALTER TABLE `", TABLE_SCHEMA,"`.`", TABLE_NAME, "` ROW_FORMAT=DYNAMIC;") AS MySQLCMD FROM TABLES WHERE TABLE_SCHEMA = "数据库名称";
生成以下批量转换SQL命令,将其拷出,粘贴到记事本。

在复制时,会把命令前后的竖杠符号“|”也一并复制了,在记事本中用替换工具将其替换掉。

点击【全部替换】,所有竖杠将消失。

在记事本中全选并复制所有命令,并粘贴到ssh中,此时,数据库将逐一执行转换工作,如下图所示,静待完成。

- 再次查看Nextcloud数据库文件格式是否已更改为Barracuda,命令中“数据库名称”更换为你的Nextcloud数据库名称,记得保留后面的“%”符号。
SELECT NAME, SPACE, FILE_FORMAT FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME like "数据库名称%";
此时,所有数据库文件格式已成功转换为Barracuda。

- 在Nextcloud的config.php中把mysql.utf8mb4设为true,进入Nextcloud网站目录,运行如下命令。
sudo -u www-data php occ config:system:set mysql.utf8mb4 --type boolean --value="true"
- 通过运行修复步骤将Nextcloud所有表转换为新的排序规则 。
sudo -u www-data php occ maintenance:repair
- 等待完成。

完成后,再次刷新管理后台的【概览】页,相关警告提示消失。