問題:數(shù)據(jù)庫A的字符集是US7ASCII,數(shù)據(jù)庫B的字符集是ZHS16GBK,通過在數(shù)據(jù)庫B上創(chuàng)建A的dblink查詢A的數(shù)據(jù)但出現(xiàn)亂碼。
在A庫中創(chuàng)建一個視圖,用utl_raw.cast_to_raw 函數(shù)對中文字段進行轉換,在B庫select該視圖,用utl_raw.cast_to_varchar2函數(shù)對中文字段再轉化一次
1.應用:
在database a中:
sql>select a.remark from a@db_link_b; db_link_b連到database b
中文出現(xiàn)亂碼。
其中database a的數(shù)據(jù)庫字符集為:AMERICAN_AMERICA.WE8ISO8859P1.
database b的數(shù)據(jù)庫字符集為:
AMERICAN_AMERICA.UTF8.
日常,database b的客戶端用CHINESE_CHINA.ZHS16GBK 往數(shù)據(jù)庫輸入漢字。
解決方案如下:
1、先在database b,user b中建view,將中文字段用utl_raw.cast_to_raw轉換
CREATE OR REPLACE VIEW view_1 (
remark
) AS
SELECT Utl_Raw.cast_to_raw(remark) remark FROM b.table;
2、在database a上用如下的sql來select就可以正常顯示中文了:
SELECT Convert(Convert(UTL_RAW.CAST_TO_VARCHAR2(remark),'ZHS16GBK','UTF8'),'WE8ISO8859P1') FROM b.view_1@db_link_b;