历史上,MySQL及其衍生版本使用'utf8'作为alias来表示utf8mb3——这是MySQL对标准UTF8的3字节实现,而标准UTF8是4字节的。从MySQL 8.0.28和mariadb 10.6.1开始,'utf8mb3'字符集已被弃用,未来将不再支持,而'utf8'将成为'utf8mb4'的引用。
自Zabbix 6.0起,已支持'utf8mb4'。为避免未来问题,强烈建议使用'utf8mb4'。切换到'utf8mb4'的另一个优势是支持补充Unicode字符。
由于Zabbix 6.0之前的版本不支持utf8mb4,请确保先将Zabbix server和数据库架构升级到6.0.x,然后再执行utf8mb4转换。
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. 在数据库级别修复字符集和排序规则:
修复后的值:
mysql> SELECT @@character_set_database, @@collation_database;
+--------------------------+----------------------+
| @@character_set_database | @@collation_database |
+--------------------------+----------------------+
| utf8mb4 | utf8mb4_bin |
+--------------------------+----------------------+
5. 加载script以修复表和列级别的字符集和排序规则:
6. 执行脚本:
SET @ZABBIX_DATABASE = '<your DB name>';
如果mariadb → set innodb_strict_mode = OFF;
CALL zbx_convert_utf8();
如果mariadb → set innodb_strict_mode = ON;
drop procedure zbx_convert_utf8;
请注意,'utf8mb4'预计会占用稍多的磁盘空间。
7. 如果没有错误,可以创建修复后的数据库备份副本。
8. 启动Zabbix。