天天看點

Postgres用戶端編碼問題

轉載 原文位址 --- 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編碼一緻),才不亂碼。轉載