數(shù)據(jù)庫管理系統(tǒng)支持某種編碼,主要涉及三個方面: 數(shù)據(jù)庫服務(wù)器支持。 數(shù)據(jù)訪問接口支持。 客戶端工具支持。 1 數(shù)據(jù)庫服務(wù)器字符編碼 : 數(shù)據(jù)庫服務(wù)器支持某種編碼,是指數(shù)據(jù)庫服務(wù)器能夠從客戶端接收、存儲以及向客戶端提供該種編碼的字符(包括標識符、字
數(shù)據(jù)庫管理系統(tǒng)支持某種編碼,主要涉及三個方面:
數(shù)據(jù)庫服務(wù)器支持。
數(shù)據(jù)訪問接口支持。
客戶端工具支持。
1 數(shù)據(jù)庫服務(wù)器字符編碼:
數(shù)據(jù)庫服務(wù)器支持某種編碼,是指數(shù)據(jù)庫服務(wù)器能夠從客戶端接收、存儲以及向客戶端提供該種編碼的字符(包括標識符、字符型字段值),并能將該種編碼的字符轉(zhuǎn)換到其它編碼(如UTF-8編碼轉(zhuǎn)到GBK編碼)。
1.1指定數(shù)據(jù)庫服務(wù)器編碼:
Postgresql:
創(chuàng)建數(shù)據(jù)庫時指定:
CREATE DATABASE … ENCODING …
可以取ASCII、UTF-8、EUC_CN、……
1.2查看數(shù)據(jù)庫編碼
Postgresql:
show server_encoding
2 數(shù)據(jù)庫訪問接口編碼
數(shù)據(jù)訪問接口支持某種編碼,該接口要做到能對該種編碼的字符進行正確讀寫,不應(yīng)出現(xiàn)數(shù)據(jù)丟失、數(shù)據(jù)失真等情況。
以JDBC接口為例:
JDBC接口一般根據(jù)JVM的file.encoding設(shè)置client_encoding,set client_encoding to file_encoding。
將String轉(zhuǎn)換成client_encoding編碼的字節(jié)流,傳給服務(wù)器端,原型String.getBytes(client_encoding) 。
收到服務(wù)器的字節(jié)流后,使用client_encoding構(gòu)造String對象作為getString的返回值給應(yīng)用程序,原型String(byte[], …, client_encoding)
3 客戶端編碼
客戶端工具支持某種編碼,必須能夠顯示從數(shù)據(jù)庫讀取的該種編碼的字符,也能通過本工具將該種編碼的字符提交到給服務(wù)器端。
3.1 Postgresql指定會話的客戶端編碼
SET CLIENT_ENCODING TO 'value'
3.2查看數(shù)據(jù)庫編碼
Show client_encoding
4 查看字符不同編碼的二進制字符串
下面是幾個字符在不同編碼下數(shù)據(jù)庫中的二進制存儲串,Postgresql中Select decoding(name,’escape’) from test可以查看數(shù)據(jù)庫服務(wù)器中二進制串。
4。1 以“貝鋼”為例
GBK編碼為:B1B4 B8D6
UTF-8編碼為:E8B49D E992A2
GB18030編碼為:B1B4 B8D6
4。2 以“”為例
GBK編碼為:FE57 FE54
UTF-8編碼為:EEA09C EEA099
GB18030編碼為:8336C9388336C935
5 編碼轉(zhuǎn)換示例
下面通過具體的例子看一下,這個例子中客戶端使用GBK/GB18030編碼,接口兩端使用GBK18030編碼,數(shù)據(jù)庫服務(wù)器使用UTF-8編碼:
轉(zhuǎn)換涉及:
應(yīng)用程序中編碼和連接客戶端編碼之間的轉(zhuǎn)換
連接服務(wù)器端編碼和數(shù)據(jù)庫服務(wù)器編碼之間的轉(zhuǎn)換
在上圖中以橙紅色箭頭表示
以“”為例,不同編碼下在數(shù)據(jù)庫服務(wù)器中的二進制串分別為:
GBK編碼為:FE57 FE54
UTF-8編碼為:EEA09C EEA099
GB18030編碼為:8336C9388336C935
Socket:
編程接口保證發(fā)送給服務(wù)器端的字符編碼和當(dāng)前會話的client_encoding保持一致。
可以將client_encoding設(shè)成從應(yīng)用程序獲得的字符的當(dāng)前編碼
也可以獲得當(dāng)前會話的client_encoding,將從應(yīng)用程序獲得的字符轉(zhuǎn)化成client_encoding設(shè)置的編碼
Server:
client_encoding和server_encoding 之間的轉(zhuǎn)換
根據(jù)數(shù)據(jù)庫編碼轉(zhuǎn)換算法轉(zhuǎn)換,把目標編碼中沒有的做法轉(zhuǎn)換成問號“”
6平時遇到的問題
對字符進行了錯誤的編碼解析,導(dǎo)致出現(xiàn)亂碼。
字符在兩個字符集中都存在,導(dǎo)致這部分字符變成“”
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com