postgresql使用dump導入導出過程中遇到的字符集問題


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編碼,導入時就不會有任何問題了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM