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

起因

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

?
1
2
3
4
5
6
7
mysql> select @@version;
+———–+
| @@version |
+———–+
| 8.0.11    |
+———–+
1 row in set

在windows服务器中每天备份一次数据库数据,防止出现各种意外。这里就使用了mysql的 mysqldump 服务来导出备份,备份初始脚本如下

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@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\ 下面生成一个文件

%Windows 服务器中使用 mysqldump 命令导出数据中文乱码问题的解决方案-猿站网-插图

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

%Windows 服务器中使用 mysqldump 命令导出数据中文乱码问题的解决方案-1猿站网-插图

解决办法

检查编码 这里为了防止我们数据库编码不对,我们先用命令查看数据库编码,这里可以看到编码都是正常的, 主要字段是 character_set_results 的编码
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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中执行是手动执行,虽然不是乱码,但是我们放在脚本中执行就出现乱码了,这个办法显然对于我来说是不可行的。

?
1
mysqldump -uroot -p –add-drop-table xxx_project > D:\xxx.sql
解决方案二(不可行)

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

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

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

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

打开文件后依然乱码

最终方案 最后在MySQL官网找到一段 mysqldump 相关的说明,在这段代码中找到了解决方案(https://dev.mysql.com/doc/refman/8.0/en/mysqldump.html)

%Windows 服务器中使用 mysqldump 命令导出数据中文乱码问题的解决方案-2猿站网-插图

这段话翻译过来就是:

说明:

在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 里面的文件内容,然后重新写入数据到文件中
?
1
mysqldump -uroot -proot –add-drop-table –default-character-set=utf8 –hex-blob xxx_project –result-file=C:\MysqlDataBackups\xxx.sql
解决办法找到了,但是光是这样执行,还达不到我们备份的目的,于是结合脚本,最终修改为:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@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 服务器中使用 mysqldump 命令导出数据中文乱码问题的解决方案-3猿站网-插图

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

%Windows 服务器中使用 mysqldump 命令导出数据中文乱码问题的解决方案-4猿站网-插图

到此这篇关于Windows 服务器中使用 mysqldump 命令导出数据,解决中文乱码问题的文章就介绍到这了,更多相关Windows使用mysqldump导出数据中文乱码内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://www.cnblogs.com/LoveBB/p/16941639.html

声明: 猿站网有关资源均来自网络搜集与网友提供,任何涉及商业盈利目的的均不得使用,否则产生的一切后果将由您自己承担! 本平台资源仅供个人学习交流、测试使用 所有内容请在下载后24小时内删除,制止非法恶意传播,不对任何下载或转载者造成的危害负任何法律责任!也请大家支持、购置正版! 。本站一律禁止以任何方式发布或转载任何违法的相关信息访客发现请向站长举报,会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。本网站的资源部分来源于网络,如有侵权烦请发送邮件至:2697268773@qq.com进行处理。
建站知识

实现在Windows下安装Lighttpd的方法

2023-3-2 20:56:03

建站知识

小知识:crm是什么意思

2023-3-2 20:59:44

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索