[comment]: # ({609a8e9d-609a8e9d})
# 2 修复Zabbix 数据库的字符集及字符序

[comment]: # ({/609a8e9d-609a8e9d})

[comment]: # ({fd2a288b-25eef83a})
#### MySQL/MariaDB

从历史上看，MySQL 及其衍生版本一直将“utf8”用作 utf8mb3 的别名——这是 MySQL 自己实现的 3 字节版本，而标准 UTF8 是 4 字节的。
从 MySQL 8.0.28 和 MariaDB 10.6.1 开始，“utf8mb3”字符集已被弃用，
其支持将在未来某个时间点被移除，而“utf8”将
变为指向“utf8mb4”的引用。
从 Zabbix 6.0 开始，已支持“utf8mb4”。为避免将来出现问题，
强烈建议使用“utf8mb4”。
切换到“utf8mb4”的另一个优点是支持补充 Unicode
字符。

::: notewarning
由于 Zabbix 6.0 之前的版本无法识别 utf8mb4，请确保在执行 utf8mb4 转换之前，
先将 Zabbix 服务器和数据库 schema 升级到 6.0.x 或更高版本。
:::

**1.** 检查数据库字符集和排序规则。

例如：

    mysql> SELECT @@character_set_database, @@collation_database;
    +--------------------------+----------------------+
    | @@character_set_database | @@collation_database |
    +--------------------------+----------------------+
    | latin2                   | latin2 _general_ci   |
    +--------------------------+----------------------+

或者：

    mysql> SELECT @@character_set_database, @@collation_database;
    +--------------------------+----------------------+
    | @@character_set_database | @@collation_database |
    +--------------------------+----------------------+
    | utf8                     | utf8_bin             |
    +--------------------------+----------------------+

如我们所见，这里的字符集不是“utf8mb4”，排序规则也不是
“utf8mb4\_bin”，因此需要进行修正。

**2.** 停止 Zabbix。

**3.** 创建数据库备份！

**4.** 在数据库级别修正字符集和排序规则：

    alter database <your DB name> character set utf8mb4 collate utf8mb4_bin;

修正后的值：

    mysql> SELECT @@character_set_database, @@collation_database;
    +--------------------------+----------------------+
    | @@character_set_database | @@collation_database |
    +--------------------------+----------------------+
    | utf8mb4                  | utf8mb4_bin          |
    +--------------------------+----------------------+ 

**5.** 加载
[脚本](../../../../assets/en/manual/appendix/install/utf8mb4_convert.sql)
以在表和列级别修正字符集和排序规则：

    mysql <your DB name> < utf8mb4_convert.sql

**6.** 执行脚本：

                   SET @ZABBIX_DATABASE = '<your DB name>';
    If MariaDB →  set innodb_strict_mode = OFF;        
                   CALL zbx_convert_utf8();
    If MariaDB →  set innodb_strict_mode = ON;   
                   drop procedure zbx_convert_utf8;

请注意，“utf8mb4”预计会占用略多一些的磁盘空间。

**7.** 如果没有错误，您可能需要为
修正后的数据库再创建一份备份。

**8.** 启动 Zabbix。

[comment]: # ({/fd2a288b-25eef83a})
