修改mysql默认字符集为latin1_修改Mysql5.7镜像中数据库默认字符集latin1为utf8,解决zabbix的item不能保存中文字符...

本文介绍了如何在Docker部署的MySQL5.7环境中,从默认的latin1字符集切换到utf8,以解决Zabbix保存中文字符的问题。通过停止、删除MySQL容器,清理数据,创建新镜像并修改配置文件,最终成功设置数据库和服务器的字符集为utf8。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在前篇《Docker方式安装ZabbixServer/Agent及Grafana》(https://www.jianshu.com/p/055a3cf63233

)一文中,创建zabbix数据库时,由于默认的字符集为latin1,导致在zabbix中,item中无法保存中文,因此,要想办法将其字符集修改为utf8。以下为详细步骤。

清理干净mysql-server容器及持久化数据

[root@k8s-node1 ~]# docker stop mysql-server && docker rm mysql-server

mysql-server

mysql-server

[root@k8s-node1 ~]# rm -rf /data/zabbix/mysql

[root@k8s-node1 ~]# mkdir -p /data/zabbix/mysql

[root@k8s-node1 ~]# chmod 777 /data/zabbix/mysql

打标签

[root@k8s-node1 ~]# docker tag 10.0.0.122:8082/mysql:5.7 mysql:test

建一个空数据库起来

[root@k8s-node1 ~]# docker run --name mysql-test -t \

> -e MYSQL_ROOT_PASSWORD="root" \

> -d mysql:test

7560a6fce6bbacbc22a43bacdeaf8a42a26db8b2b7f02b049201a7e69e1876b6

修改mysql初始配置

[root@k8s-node1 ~]# docker cp mysql-test:/etc/mysql/mysql.conf.d/mysqld.cnf .

[root@k8s-node1 ~]# vi mysqld.cnf

# 在文件末尾添加以下几行:

init_connect='SET collation_connection = utf8_unicode_ci'

init_connect='SET NAMES utf8'

character-set-server=utf8

collation-server=utf8_unicode_ci

# to enforce using of utf8 encoding in db, you can add:

skip-character-set-client-handshake

[client]

default-character-set=utf8

[mysql]

default-character-set=utf8

[root@k8s-node1 ~]# docker cp mysqld.cnf mysql-test:/etc/mysql/mysql.conf.d/.

制作新镜像

[root@k8s-node1 ~]# docker commit mysql-test mysql:test2

sha256:f0e697ed338425e91fecef71a28ed625c7455001d6b7b77a5d1bc1edcef1f8c1

[root@k8s-node1 ~]# docker stop mysql-test && docker rm mysql-test

mysql-test

mysql-test

运行新镜像

[root@k8s-node1 ~]# docker run --name mysql-server -t \

-e MYSQL_DATABASE="zabbix" \

-e MYSQL_USER="zabbix" \

-e MYSQL_PASSWORD="zabbix" \

-e MYSQL_ROOT_PASSWORD="root" \

-v /data/zabbix/mysql:/var/lib/mysql \

-d --restart=always mysql:test2

a7e664c63f40586e8fe2a76cc2e43e57c3ab68e487e5bda9f93420c55d4f7508

验证一下

[root@k8s-node1 ~]# docker exec -it mysql-server /bin/sh

# mysql -uroot -proot -Dzabbix

mysql: [Warning] Using a password on the command line

affiliates. Other names may be trademarks of their respective

owners.

........

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

# 查看MYSQL数据库服务器和数据库字符集

mysql> show variables like '%character%';

+--------------------------+----------------------------+

| Variable_name | Value |

+--------------------------+----------------------------+

| character_set_client | utf8 |

| character_set_connection | utf8 |

| character_set_database | utf8 |

| character_set_filesystem | binary |

| character_set_results | utf8 |

| character_set_server | utf8 |

| character_set_system | utf8 |

| character_sets_dir | /usr/share/mysql/charsets/ |

+--------------------------+----------------------------+

8 rows in set (0.02 sec)

# 查看zabbix字符集

mysql> show create database zabbix;

+----------+-----------------------------------------------------------------------------------------+

| Database | Create Database |

+----------+-----------------------------------------------------------------------------------------+

| zabbix | CREATE DATABASE `zabbix` /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci */ |

+----------+-----------------------------------------------------------------------------------------+

1 row in set (0.00 sec)

# 可见成功字符集已经默认为utf8!

附:mysql5.7镜像简单分析

[root@k8s-node1 ~]# docker exec mysql-server ls -l /

......

lrwxrwxrwx 1 root root 34 Apr 23 04:15 entrypoint.sh -> usr/local/bin/docker-entrypoint.sh

......

可见,在此容器的根目录下有一个链接entrypoint.sh指向/usr/local/bin/docker-entrypoint.sh文件,该文件在容器启动后会被运行,执行初始化动作。分析其代码发现,它接受5个环境变量参数:

# 跳到183行

# Initialize values that might be stored in a file

file_env 'MYSQL_ROOT_HOST' '%'

file_env 'MYSQL_DATABASE'

file_env 'MYSQL_USER'

file_env 'MYSQL_PASSWORD'

file_env 'MYSQL_ROOT_PASSWORD'

在运行容器时如果指定了MYSQL_DATABASE、'MYSQL_USER、MYSQL_PASSWORD这三个参数,那么它就会创建一个指定用户密码的自定义空数据库。

# 再走到275行

# Creates a custom database and user if specified

if [ -n "$MYSQL_DATABASE" ]; then

mysql_note "Creating database ${MYSQL_DATABASE}"

docker_process_sql --database=mysql <<

fi

这一段是创建自定义数据库代码,因为在语句中未指定“default character set utf8”,因此它使用了默认的字符集“latin1”。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值