Mysqldump匯出亂碼問題排查

reggie發表於2022-03-15

最近需要匯出資料庫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

本作品採用《CC 協議》,轉載必須註明作者和本文連結
微信公眾號:碼咚沒 ( ID: codingdongmei )

相關文章