MySQL运维实战(5.6) 字符集设置对mysqldump的影响

作者:俊达

引言

在进行MySQL数据库的备份和恢复过程中,使用mysqldump命令是一种常见的方法。然而,一个容易忽略的问题是在执行备份时未指定字符集可能导致数据丢失或编码问题。在处理包含特殊字符或不同编码的数据时,选择适当的字符集设置对于数据的完整性和准确性至关重要。

mysqldump不指定字符集

不指定字符集时,默认使用了utf8。可能和环境有关系。

mysqldump -uroot test test_load > test_dump.sql

$ more test_dump.sql
-- MySQL dump 10.13  Distrib 5.7.39, for osx10.17 (x86_64)
--
-- Host: localhost    Database: test
-- ------------------------------------------------------
-- Server version       8.0.31

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;


$ grep INSERT test_dump.sql  | od -t x1
0000000    49  4e  53  45  52  54  20  49  4e  54  4f  20  60  74  65  73
0000020    74  5f  6c  6f  61  64  60  20  56  41  4c  55  45  53  20  28
0000040    27  e5  88  97  e5  88  97  e5  88  97  e5  88  97  e5  88  97
0000060    41  41  41  27  2c  27  e5  88  97  e5  88  97  e5  88  97  e5
0000100    88  97  e5  88  97  41  41  41  27  29  3b  0a
0000114

mysqldump指定字符集

mysqldump --default-character-set gbk -uroot test test_load > test_dump_gbk.sql

more test_dump_gbk.sql
-- MySQL dump 10.13  Distrib 5.7.39, for osx10.17 (x86_64)
--
-- Host: localhost    Database: test
-- ------------------------------------------------------
-- Server version       8.0.31

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES gbk */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Table structure for table `test_load`
--

DROP TABLE IF EXISTS `test_load`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `test_load` (
  `c_gbk` varchar(100) CHARACTER SET gbk COLLATE gbk_chinese_ci DEFAULT NULL,
  `c_utf8` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*!40101 SET character_set_client = @saved_cs_client */;

$ grep INSERT test_dump_gbk.sql  | od -t x1
0000000    49  4e  53  45  52  54  20  49  4e  54  4f  20  60  74  65  73
0000020    74  5f  6c  6f  61  64  60  20  56  41  4c  55  45  53  20  28
0000040    27  c1  d0  c1  d0  c1  d0  c1  d0  c1  d0  41  41  41  27  2c
0000060    27  c1  d0  c1  d0  c1  d0  c1  d0  c1  d0  41  41  41  27  29
0000100    3b  0a

使用mysqldump备份和恢复数据时,建议制定字符集为utf8mb4。

utf8mb4

测试数据

mysql> CREATE TABLE `test_dump` (
  `a` varchar(100) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;


mysql> insert into test_dump values (unhex('f09f9882')),('列');
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select a, hex(a) from test_dump;
+------+----------+
| a    | hex(a)   |
+------+----------+
| ?    | F09F9882 |
|| E58897   |
+------+----------+
2 rows in set (0.00 sec)

导出数据

$ mysqldump --default-character-set utf8mb4 -uroot test test_dump > test_dump_utf8mb4.txt
$ mysqldump --default-character-set utf8 -uroot test test_dump > test_dump_utf8mb3.txt

查看文件

$ grep INSERT test_dump_utf8mb4.txt
INSERT INTO `test_dump` VALUES ('😂'),('列');


$ grep INSERT test_dump_utf8mb3.txt
INSERT INTO `test_dump` VALUES ('?'),('列');

如果不指定default-character-set为utf8mb4,则utf8mb4编码的数据无法导出,会导致数据丢失,所以建议使用utf8mb4。

总结

使用mysqldump备份数据时,强烈建议指定字符集为UTF8MB4,以确保对各种数据类型的正确处理,避免在数据导出和导入过程中发生编码问题,从而保障数据的完整性和可靠性。

更多技术信息请查看云掣官网https://yunche.pro/?t=yrgw

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果你想将MySQL 8.0的字符集从utf8mb4改为utf8,可以按照以下步骤进行: 1. 登录MySQL数据库。 2. 运行以下命令,查看当前字符集设置: ``` SHOW VARIABLES LIKE 'character_set%'; ``` 如果你看到的是utf8mb4,那么就需要进行字符集设置的更改。 3. 运行以下命令,备份你的数据库: ``` mysqldump -u username -p database_name > backup.sql ``` 其中,username是你的MySQL用户名,database_name是你要备份的数据库名,backup.sql是你的备份文件名。 4. 关闭MySQL数据库。 5. 编辑MySQL的配置文件my.cnf,在[mysqld]下添加以下两行: ``` [mysqld] character_set_server=utf8 ``` 6. 启动MySQL数据库。 7. 运行以下命令,修改数据库的字符集: ``` ALTER DATABASE database_name CHARACTER SET utf8 COLLATE utf8_general_ci; ``` 其中,database_name是你要修改的数据库名。 8. 运行以下命令,修改每个表的字符集: ``` ALTER TABLE table_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; ``` 其中,table_name是你要修改的表名。 9. 运行以下命令,查看字符集是否修改成功: ``` SHOW VARIABLES LIKE 'character_set%'; ``` 10. 如果成功修改字符集,那么恢复你的数据库,运行以下命令: ``` mysql -u username -p database_name < backup.sql ``` 其中,username是你的MySQL用户名,database_name是你要恢复的数据库名,backup.sql是你的备份文件名。 11. 最后,重启MySQL数据库,使得所有更改生效。 注意,修改字符集可能会影响到数据库中的数据,因此在进行操作之前请务必备份数据库。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值