轉載 原文位址 --- https://www.cnblogs.com/winkey4986/p/6279243.html
資料庫程式設計的編碼問題
資料庫程式設計設計的編碼問題包括三個方面:
資料庫伺服器編碼;
資料庫用戶端編碼;
本地環境編碼。
(1)資料庫伺服器字元編碼:
資料庫伺服器支援某種編碼,是指資料庫伺服器能夠從用戶端接收、存儲以及向用戶端提供該種編碼的字元,并能将該種編碼的字元轉換到其它編碼。
檢視PostgreSQL資料庫伺服器端編碼:
postgres=# show server_encoding;
server_encoding
UTF8
postgres=# l
名稱 | 擁有者 | 字元編碼 | Collate | Ctype | TestDb1 | TestRole1 | UTF8 | Chinese (Simplified)_People's Republic of China.936 | Chinese (Simplified)_People's Republic of China.936 |
TestDb2 | postgres | UTF8 | Chinese (Simplified)_People's Republic of China.936 | Chinese (Simplified)_People's Republic of China.936 |
postgres | postgres | UTF8 | Chinese (Simplified)_People's Republic of China.936 | Chinese (Simplified)_People's Republic of China.936 |
template0 | postgres | UTF8 | Chinese (Simplified)_People's Republic of China.936 | Chinese (Simplified)_People's Republic of China.936 |
(2)資料庫用戶端字元編碼:
用戶端工具支援某種編碼,必須能夠顯示從資料庫讀取的該種編碼的字元,也能通過本工具将該種編碼的字元送出到給伺服器端。
檢視PostgreSQL用戶端工具psql編碼:
postgres=# show client_encoding;
GBK
postgres=# encoding
指定Postgresql會話的用戶端編碼:
postgres=# set client_encoding to 'utf8';
SET
client_encoding
(3)本地環境編碼:
如果使用dos的指令行界面,本地環境就是指dos指令行環境的編碼,可以使用dos指令chcp檢視dos環境編碼:
D:Program FilesPowerCmd>chcp
活動代碼頁: 936
----936為簡體中文,GBK;
如果在使用某種編輯器,則本地環境編碼取該編輯器的編碼設定。
四、執行個體
雖然PG支援用戶端和伺服器端的編碼自動轉換,但是還需要遵從一個原則:本地環境的編碼和用戶端編碼需一緻。
1、PostgreSQL的資料庫postgres,伺服器端字元編碼為utf8,用戶端工具psql字元編碼為GBK,本地環境dos指令編輯器編碼為GBK,此時:
(1 行記錄)
postgres=# show client_encoding;
GBK
postgres=# ! chcp
postgres=# select * from "TestTb1";
Column1
測試
11
由于本地環境和用戶端編碼都是GBK,一緻,沒有問題;
insert時,用戶端接收本地環境輸入的GBK字元(兩者都為GBK),用戶端傳到伺服器端時自動轉換為UTF-8編碼存儲,沒有問題;
select時,伺服器端傳到用戶端,UTF-8編碼自動轉換為GBK編碼,在本地環境顯示時,本地環境就是GBK編碼,顯示沒有問題。
2、PostgreSQL的資料庫postgres,伺服器端字元編碼為utf8,用戶端工具psql字元編碼為utf8,本地環境dos指令編輯器編碼為GBK,此時:
postgres=# set client_encoding to 'utf8';
SET
postgres=# insert into test values('測試1');
閿欒?: 鏃犳晥鐨?"UTF8" 缂栫爜瀛楄妭椤哄簭: 0xb2
postgres=# select * from test;
column1
娴嬭瘯
(1 行記錄)
由于用戶端和伺服器的編碼一緻,故不進行轉碼,
insert時,本地輸入的GBK編碼到用戶端不自動轉換,用戶端把接收的字元作為utf編碼傳給伺服器端不轉換,GBK的編碼作為UTF-8存儲,故有問題。
報錯的資訊為:ERROR: invalid byte sequence for encoding "UTF8": 0xb2;
select時,服務端的utf編碼傳給用戶端不轉換,用戶端把utf編碼傳給本地環境不自動轉換,utf8編碼用gbk編碼顯示,故有問題。
3、本地環境就是指此時使用的環境,起初我使用powercmd代替windows的cmd指令行工具,實作上面第1個執行個體是總是失敗(亂碼)。
原因就是,此時本地環境編碼是指powercmd的編碼,而不是執行chcp指令得到的編碼。
而powercmd使用的編碼究竟是什麼,我也沒有找到。
總結:①直接在psql執行insert或者select的時候,設定client_encoding=gbk(預設),不亂碼;(上面例子證明了)
②使用“i sql檔案.sql”(sql檔案是utf8編碼)指令的時候,如果sql檔案中有中文,一定要先行執行set client_encoding=utf8;(設定此之後,按照上面說的,用戶端不轉換,直接把接收的字元作為utf8編碼傳給伺服器端,而檔案本身就是utf8,是以不亂碼;同理如果sql檔案是ansi編碼即gbk編碼的話,確定client_encoding為gbk;總之,sql檔案與client_encoding編碼一緻),才不亂碼。轉載