历史上,MySQL及其衍生版本使用“utf8”作为utf8mb3的alias——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. 创建数据库的备份copy!
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. 如果没有错误——你可能想要使用create对修复后的数据库进行copy备份。
8. 启动Zabbix。