起因

环境:阿里云服务器(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 脚本,就能做到一天备份一次数据库拉。

Windows 服务器中使用 mysqldump 命令导出数据,解决中文乱码问题的更多相关文章

  1. spingboot项目在windows环境中运行时接收参数及日志中文乱码

    1.logback.xml配置 appender中添加 <param name="Encoding" value="UTF-8" /> <co ...

  2. 【C#】C#中使用GDAL3(二):Windows下读写Shape文件及超详细解决中文乱码问题

    转载请注明原文地址:https://www.cnblogs.com/litou/p/15035790.html 本文为<C#中使用GDAL3>的第二篇,总目录地址:https://www. ...

  3. MySQL直接导出CSV文件,并解决中文乱码的问题

    需求: 需要导出hr_users 表中的部分字段的数据,以前是用PHP写脚本,然后导出CSV文件. 在MySQL中,它自己就能导出CSV文件 ,只不过是有如下几个问题需要大家解决. 1. 生成文件不成 ...

  4. sqlserver bcp命令导出数据

    原文:sqlserver bcp命令导出数据 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net ...

  5. Spring Boot项目生成jar包,并在windows服务器中注册成服务,开机启动

    背景: 使用Spring Boot开发的Web项目,打包生成了一个jar包,希望能部署在Windows服务器中 尝试: 1.Spring Boot生成的jar包,可以直接用java -jar运行,但是 ...

  6. PHP连接sqlserver的两种方法,向sqlserver2000中写入数据,中文乱码

    项目环境是php5.3.28 项目用的ThinkPHP3.2.3  已经mysql5.5数据库,要和另一个项目对接,需要连接sqlsever2000数据库进行一些操作. 第一种用php自带扩展连接数据 ...

  7. iOS 中json解析数据出现中文乱码的问题

    一般服务器的编码格式都是UTF8,这样通过json解析下来的的数据,一般中文是不会出现乱码,但是如果服务器的编码格式不是UTF8,通过json解析的数据中的中文容易出现luan乱码,怎么解决这个问题呢 ...

  8. impala-shell导出数据存在中文异常问题

    由于查询在impala-shell 中没有问题,在导出数据的时候才有问题,这是impala-shell的客户端是由python编写的,而Python无法自动将unicode对象写入没有设置默认编码的输 ...

  9. sqoop导出到mysql中文乱码问题总结、utf8、gbk

    sqoop导出到mysql中文乱码问题总结.utf8.gbk 今天使用sqoop1.4.5版本的(hadoop使用cdh5.4)因为乱码问题很是头痛半天.下面进行一一总结 命令: [root@sdzn ...

  10. mysql 恢复数据时中文乱码

    mysql恢复数据时中文乱码,解决办法. 用source命令导入mysql数据库怎么设置中文编码 1.导出数据时指定编码在导出mysql sql执行文件的时候,指定一下编码格式: mysqldump ...

随机推荐

  1. HK32F030MF4P6的Linux GCC工具链和VSCode开发环境

    HK32F030MF4P6简介 航顺的 HK32F030MF4P6, TSSOP20封装, Arm Cortex M0 内核, 内建32MHz时钟, 16K Flash, 2K RAM(实际上可用的有 ...

  2. 【疑难杂症】关于pycharm无法安装插件显示网络错误问题

    今天实在受不了英文的pycharm了,想着赶紧装个中文的插件,结果插件界面给我说我网络有问题 search results are not loaded check the internet conn ...

  3. Filebeat 调试

    默认情况下,Filebeat将其所有输出发送到syslog. 在前台运行Filebeat时,可以使用-e命令行标志将输出重定向到标准错误. 例如: filebeat -e 默认配置文件是filebea ...

  4. 使用 fail2ban 和 FirewallD 黑名单保护你的系统

    如果你运行的服务器有面向公众的 SSH 访问,你可能遇到过恶意登录尝试.本文介绍了如何使用两个实用程序来防止入侵者进入我们的系统. 为了防止反复的 ssh 登录尝试,我们来看看 fail2ban.而且 ...

  5. VLQ & Base64 VLQ 编码方式的原理及代码实现

    目录 VLQ Base64 VLQ VLQ VLQ (Variable-length quantity)是一种通用的,使用任意位数的二进制来表示一个任意大的数字的一种编码方式. 编码实现: ** 对数 ...

  6. C语言小白刷题

    1.有n个评委,他们给出score个分数,请用代码写出平均值,ave代表平均值 2022-10-15 13:17:10 int main() { int n, i =1, score, sum = 0 ...

  7. 2022.2.26A组总结&反思

    今天的发挥比较奇妙.. T1:一眼dp+高斯消元,但是感觉细节比较多,然后先去做了T2,写完后回来推了一下就做出来了.比较裸,但是细节确实多,但是很可惜的一点是最后提交的代码没有判不合法,到手的100 ...

  8. Linux系统管理_软件管理

    RPM命令 #管理.rpm文件 #RPM包软件命名规则:name-version-releases.arch.rpm rpm -ivh pkgname #安装软件包 rpm -ivh --test p ...

  9. 齐博x1内容评论标签的风格制作

    评论的标签如下: {qb:comment name="xxxxx" rows='5'} HTML代码片段 {/qb:comment} 评论涉及到的元素有{posturl} 这个是代 ...

  10. 知识图谱顶会论文(ACL-2022) CAKE:用于多视图KGC的可扩展常识感知框架

    CAKE:用于多视图KGC的可扩展常识感知框架.pdf 论文地址:CAKE:Scalable Commonsense-Aware Framework For Multi-View Knowledge ...