Windows 服务器中使用 mysqldump 命令导出数据,解决中文乱码问题

起因

环境:阿里云服务器(windows server)、mysql(8.0.11)

mysql> select @@version;
+-----------+
| @@version |
+-----------+
| 8.0.11    |
+-----------+
1 row in set
  • 在windows服务器中每天备份一次数据库数据,防止出现各种意外。这里就使用了mysql的 mysqldump 服务来导出备份,备份初始脚本如下
@echo off
set hour=%time:~0,2%
if "%time:~0,1%"==" " set hour=0%time:~1,1%
set now=%Date:~0,4%%Date:~5,2%%Date:~8,2%%hour%%Time:~3,2%%Time:~6,2%
echo %now%
set host=127.0.0.1
set port=3306
set user=root
set pass=马赛克
# 要备份的数据库,这里我项目的数据库是 xxx_project
set dbname=xxx_project
# 备份文件所在的位置,这里我固定放在 C:\MysqlDataBackups\ 下面,%dbname%-%now%.sql 是要生成的文件名称
set backupfile=C:\MysqlDataBackups\%dbname%-%now%.sql
# 运行备份命令 C:\mysql-8.0.11-winx64\bin\mysqldump 是我 mysql 安装目录下 mysqldump 所在的位置
"C:\mysql-8.0.11-winx64\bin\mysqldump" -h%host% -P%port% -u%user% -p%pass% -c --add-drop-table %dbname% > %backupfile%
echo delete files before 10 days
forfiles /p E:\MysqlDataBackups /s /m *.sql /d -60 /c "cmd /c del @file /f"
@echo on

命令保存为 bat 文件,双击执行,能成功在 C:\MysqlDataBackups\ 下面生成一个文件


但是,当我们打开文件看的时候,发现里面的备注,中文相关的都是乱码(PS:Notepad++ 软件打开不会,可能是因为这个软件比较智能)

解决办法

检查编码

  • 这里为了防止我们数据库编码不对,我们先用命令查看数据库编码,这里可以看到编码都是正常的, 主要字段是 character_set_results 的编码
mysql> show variables like '%char%';
+--------------------------+----------------------------------------+
| Variable_name            | Value                                  |
+--------------------------+----------------------------------------+
| character_set_client     | utf8                                   |
| character_set_connection | utf8                                   |
| character_set_database   | utf8mb4                                |
| character_set_filesystem | binary                                 |
| character_set_results    | utf8                                   |
| character_set_server     | utf8mb4                                |
| character_set_system     | utf8                                   |
| character_sets_dir       | C:\mysql-8.0.11-winx64\share\charsets\ |
+--------------------------+----------------------------------------+
8 rows in set

上面几个变量说明:

  • character_set_client: 设置客户端使用的字符集。
  • character_set_connection: 连接数据库的字符集设置类型,如果程序没有指明连接数据库使用的字符集类型则按照服务器端默认的字符集设置。
  • character_set_database: 设置数据库服务器中某个库的字符集。
  • character_set_filesystem: 设置文件系统的字符集。
  • character_set_results: 设置服务端返回给客户端结果显示使用的字符集。
  • character_set_server: 设置服务器安装时指定的默认字符集。
  • character_set_system: 设置数据库系统使用的字符集。

如果上面编码不对的话,想快速设置的话执行:set character_set_results = utf8;

上面这个只在当前终端有效,如果想永久保存的话还是需要修改my.ini的配置文件。

解决方案一(不适用)

  • 网上很多说法是 Windows PowerShell 输出重定向 (“>”) 文件编码默认为UTF-16(LE)问题,解决办法都是把命令拿去 cmd 中执行 ,但是我们这里是写成脚本了,在cmd中执行是手动执行,虽然不是乱码,但是我们放在脚本中执行就出现乱码了,这个办法显然对于我来说是不可行的。

mysqldump -uroot -p --add-drop-table xxx_project > D:\xxx.sql

解决方案二(不可行)

  • 还有的文章说在导出的命令上加上各种编码参数,如:--default-character-set=utf8

mysqldump -uroot -proot --add-drop-table --default-character-set=utf8 xxx_project > D:\xxx.sql

  • 在网上发现另一个参数--hex-blob, 这个参数主要是为了把BINARY, VARBINARY, BLOB, BIT等类型导出为十六进制,因为这些类型比较容易乱码。再次尝试:

mysqldump -uroot -proot --add-drop-table --default-character-set=utf8 --hex-blob xxx_project > D:\xxx.sql

打开文件后依然乱码

最终方案

  • 这段话翻译过来就是:

说明:

在Windows上使用带有输出重定向的PowerShell生成的转储文件将创建一个具有UTF-16编码的文件:

mysqldump [options] > dump.sql

但是,UTF-16不允许作为连接字符集(请参阅不允许的客户端字符集),因此无法正确加载转储文件。要解决这个问题,使用——result-file选项,它会创建ASCII格式的输出:


mysqldump [options] --result-file=dump.sql
  • 最后执行的命令 --result-file 不会创建文件。所以我们要提前创建 xxx.sql 文件,每次执行都会清空 xxx.sql 里面的文件内容,然后重新写入数据到文件中

mysqldump -uroot -proot --add-drop-table --default-character-set=utf8 --hex-blob xxx_project --result-file=C:\MysqlDataBackups\xxx.sql


  • 解决办法找到了,但是光是这样执行,还达不到我们备份的目的,于是结合脚本,最终修改为:
@echo off
set hour=%time:~0,2%
if "%time:~0,1%"==" " set hour=0%time:~1,1%
set now=%Date:~0,4%%Date:~5,2%%Date:~8,2%%hour%%Time:~3,2%%Time:~6,2%
echo %now%
set host=127.0.0.1
set port=3306
set user=root
set pass=马赛克
# 要备份的数据库,这里我项目的数据库是 xxx_project
set dbname=xxx_project
# 备份文件所在的位置,这里我固定放在 C:\MysqlDataBackups\ 下面,%dbname%-%now%.sql 是要生成的文件名称
set backupfile=C:\MysqlDataBackups\%dbname%-%now%.sql
#用 bat 命令先创建文件 backupfile,然后在用 mysqldump 往这个文件中 写入数据
echo=>%backupfile%
"C:\mysql-8.0.11-winx64\bin\mysqldump" -h%host% -P%port% -u%user% -p%pass% --default-character-set=utf8 --hex-blob -c --add-drop-table %dbname% --result-file=%backupfile%
echo delete files before 10 days
forfiles /p E:\MysqlDataBackups /s /m *.sql /d -60 /c "cmd /c del @file /f"
@echo on
  • 最后看看效果

  • 最后我们用 windows 的定时任务在每天凌晨三点的时候执行这个 bat 脚本,就能做到一天备份一次数据库拉。

0 条评论
请不要发布违法违规有害信息,如发现请及时举报或反馈
还没有人评论呢,速度抢占沙发!
相关文章
  • 一、下载安装MySQL到MySQL官网下载,点击可跳转到下载地址选择你所要的版本,点击右边的Download跳转到新页面,选择下方的 No thanks, just start my download...

  • MySQL搭建 效果图 step1:下载安装包 https://downloads.mysql.com/archives/community/ step2:解压后即完成安装 step3...

  • windows2003 的安装以及安装时遇到的问题简介:Windows Server 2003是微软于2003年3月28日发布的基于Windows XP/NT5.1开发的服务器操作系统,并在同年4月底...

  • 本文旨在使用windows安装docker desktop1.准备工作1.1. 修改windows的配置项1.2. 创建docker的文件夹链接 因为默认安装在C盘 看个人使用习惯可略过在E盘对应...

  • 1 准备表结构 CREATE TABLE `student` ( `id` int NOT NULL AUTO_INCREMENT, `user_no` varchar(50) CHARAC...

  • 在平常生活中如果要安装像git、java、node这些环境的时都需要先去官网下载安装程序,点击安装,之后还需要配置,不仅过程麻烦,而且工具多了之后整理起来也相当不容易,配置也很杂,整个电脑就像被污染了...

  • 1.首先我们需要两台服务器,安装好mysql(版本为8)        2.修改主服务器mysql数据库配置文件  vim /etc/my.cnf    [mysql]    log-bin=mysq...

  • 实际工作中常见的业务场景是求次日留存率,还有一些会对次日留存率增加限制,例如求新用户的次日留存率或者求活跃用户留存率。另外,留存率和复购率看起来都是统计重复出现的概率,但实际求解方法是不一样的。 【场...

  • 1、隔离级别 SQL 标准的事务隔离级别包括:读未提交(read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(serializ...

  • 文章很长,而且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录 博客园版 为您奉上珍贵的学习资源 : 免费赠送 :《尼恩Java面试宝典》 持续更新+ 史上最全 + 面试必备 2000页+ 面试必备 ...

  • 六、用通配符进行过滤 本章介绍什么是通配符、如何使用通配符以及怎样使用LIKE操作符进行通配搜索 LIKE操作符 百分号(%)通配符 select prod_id,prod_name from p...

  • mysql查询结果拼接树结构(树节点的移动) 思路:单表内查询全部数据,在业务层内递归拼接树结构。 前端用的是element的Tree 树形控件: 树结构实体: @Data @AllArgsCo...

  • 现在有四张卡,但是部署在windows10系统上,想尝试下在windows上使用单机多卡进行分布式训练,网上找了一圈硬是没找到相关的文章。以下是踩坑过程。 首先,pytorch的版本必须是大于1.7,...

  • 前言 前几天因为看CS shellcode装了一个win10虚拟机,然后正好因为逆向课老师要装一系列工具。于是就想起来之前一直想看的windows pwn,就顺便装了一下相关工具并且入门了一下。 工具...

  • 按照官网的解释:Each session that must perform a sort allocates a buffer of this size. sort_buffer_size is n...

  • 一、安装datax 通过https://datax-opensource.oss-cn-hangzhou.aliyuncs.com/202210/datax.tar.gz这个地址下载datax.tar...

  • 因为工作业务需求的关系,需编译onnxruntime引入项目中使用,主项目exe是使用的vs2017+qt5.12。 onnxruntime就不用介绍是啥了撒,在优化和加速AI机器学习推理和训练这块赫...

  • 一般在更新时会遇到以下场景:1.所有字段全部更新;2.根据条件更新字段中的某部分内容;3.根据不同的条件更新不同的值,以下是几种场景中常用的update方法。 一、方法分类 二、具体用法 (1)根据...

  • 使用数据处理函数 函数 与其他大多数计算机语言一样,SQL支持利用函数来处理数据。函数一般是在数据上执行的,它给数据的转换和处理提供了方便。 注意: 函数没有SQL的可移植性强:能运行在多个系统上的...

  • 前言11月份的时候,有位朋友去美团面试,他说被问到Redis与MySQL双写一致性如何保证? 这道题其实就是在问缓存和数据库在双写场景下,一致性是如何保证的?本文将跟大家一起来探讨如何回答这个问题。谈...