数据库导入中文数据显示乱码解决
1.问题描述
数据库中导入中文数据时中文显示乱码???
2.探究原因
确认数据库连接的字符集设置:
show variables like '%char%';
结果显示字符编码为utf8
检查数据库和表的字符集: 再次确认数据库和表的字符集是否确实为 utf8mb4
:
SHOW CREATE DATABASE your_database_name;
SHOW CREATE TABLE your_table_name;
# 若发现编码不为utf8,修改数据库和表的编码,或在下文中的my.cnf一次性完成配置
ALTER DATABASE your_database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
ALTER TABLE your_table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
根据以上内容推断出现乱码的原因:
- 数据插入时的字符集:数据在插入数据库时使用的字符集不是
utf8mb4
。 - 客户端连接的字符集:客户端(例如命令行工具、应用程序等)连接到MySQL服务器时没有使用正确的字符集。
- 历史数据问题:如果数据是之前用其他字符集存储的,那么即使现在设置了正确的字符集,旧的数据仍然会显示为乱码。
3.解决
查看数据库字符编码SHOW VARIABLES LIKE 'character_set_%';
发现set_client和set_connection都不为utf8
临时设置,只针对当前对话:
输入命令:SET NAMES utf8mb4;
修改为:
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4
即可显示中文。
但以上设置只是针对当前对话,下一次重启mysql会话仍会报错,现进行永久设置:
1)修改MySQL配置文件: 你可以在MySQL服务器的配置文件(通常是my.cnf
或my.ini
)中添加相应的设置。这样,当MySQL服务启动时,这些设置就会被加载。
2)Linux下my.cnf文件可能路径
/etc/my.cnf
/etc/mysql/my.cnf
/usr/local/mysql/etc/my.cnf
3)添加配置:
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
[client]
default-character-set=utf8mb4
修改完成后,重新登录MySQL服务即可使更改生效。
ps:docker镜像中安装vim命令
apt update
apt install vim