码咚没

V1

2022/03/16阅读:36主题:前端之巅同款

Mysqldump导出乱码问题排查

Mysqldump导出乱码问题排查

最近需要导出数据库2个表的数据,我用的是windows, 然后使用自带的终端来执行命令,导出后发现SQL文件里对中文显示都是乱码。

mysqldump -uroot -proot database_name table_name1 table_name2 > D:\xxx.sql

尝试解决问题

一开始怀疑是数据库编码不对, 进入MySQL终端,查询如下:

$ show variables like "character%";
+--------------------------+-----------------------------------------------------------+
| Variable_name            | Value                                                     |
+--------------------------+-----------------------------------------------------------+
| character_set_client     | utf8                                                      |
| character_set_connection | utf8                                                      |
| character_set_database   | utf8                                                    |
| character_set_filesystem | binary                                                    |
| character_set_results    | utf8                                                      |
| character_set_server     | utf8                                                    |
| character_set_system     | utf8                                                      |
| character_sets_dir       | xxx |
+--------------------------+-----------------------------------------------------------+

上面几个变量说明:

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

另外说明下,有时候我们在使用终端查询时候,发现返回的结果是乱码,但是数据库里并没有乱码,一般就是 character_set_results 这个变量设置的不对。

和客户端相关是character_set_client, character_set_connectioncharacter_set_results, 想快速设置的话执行:

set character_set_results = utf8;

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

好了,说回我们的问题,为了解决乱码,我尝试在MySQLdump的时候增加选项强制指定字符集, --default-character-set=utf8

mysqldump -uroot -proot --default-character-set=utf8 database_name table_name1 table_name2  > D:\xxx.sql

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

mysqldump -uroot -proot --default-character-set=utf8 --hex-blob database_name table_name1 table_name2  > D:\xxx.sql

打开文件后依然乱码,但是这次我发现文件的编码方式显示的是UTF-16,于是我意识可能是这里出了问题。

解决问题

尝试搜索解决UTF-16的问题,最后在MySQL官网找到一段:

Note A dump made using PowerShell on Windows with output redirection creates a file that has UTF-16 encoding:

mysqldump [options] > dump.sql

However, UTF-16 is not permitted as a connection character set (see Impermissible Client Character Sets), so the dump file cannot be loaded correctly. To work around this issue, use the --result-file option, which creates the output in ASCII format:

mysqldump [options] --result-file=dump.sql

这里很明确说明了,在windows下使用PowerShell终端,使用重定向方式导出SQL文件的时候,会变成UTF-16编码,这种编码的文件是不能被MySQL正确加载的。

解决办法也很简单,增加--result-file参数,使用这个参数来指定导出文件。

mysqldump -uroot -proot --default-character-set=utf8 --hex-blob database_name table_name1 table_name2 --result-file=D:\xxx.sql

打开文件,OK,乱码消失了。

参考链接

mysqldump — A Database Backup Program


早睡早起,悟道参禅,让学习成为习惯,与君共勉。

欢迎关注微信公众号:码咚没。

分类:

后端

标签:

后端

作者介绍

码咚没
V1

自由职业者,主要做技术外包,喜欢写作分享