1. 基礎知識
需要關心3個字符集,
1)一個是執行命令所在系統環境的字符集,如果是cygdrive,查看LANG默認是utf8,如果是powershell,用chcp命令結果為936,代表gbk。
2)一個是數據庫server編碼,在psql中運行 show server_encoding,結果為utf8。這個編碼不太好改,而且官方文檔說了不支持gbk(https://www.postgresql.org/docs/12/multibyte.html)。
3)一個是client編碼,show client_encoding,結果是gbk。這個可以通過set client_encoding=xx來改變。
2. 遇到的問題及解釋
我在powershell里使用pg_dump命令導出全庫,然后再使用psql命令導入,遇到了gbk字符在utf8沒有對應值的報錯。
原因:通過vim查看導出文件編碼,顯示為utf-161e,不是utf8。雖然client編碼是gbk,與文件一致,但是導入是要先經過server,因為與server編碼不一致,所以報錯。這個原因參考文章:https://www.cnblogs.com/kuang17/p/11378845.html
3. 解決方法及教訓
將導出文件轉碼為utf8,終於可以導入了,但是數據的某些行導入時還有問題,會導致整個表數據不會插入。但這已經是最好的結果了。
教訓是:以后導出文件時,應關注環境編碼,在utf8環境下導出,比如使用cygdrive,或者將powershell的編碼改成utf8(chcp 65001),這樣導出文件編碼就是utf8,與server編碼相同,server又會將數據轉碼為client編碼,導入時就不會有任何問題了。