1. 程式人生 > >varchar2轉化nvarchar2型別亂碼

varchar2轉化nvarchar2型別亂碼

開發人員有個需求,需將一個字串,轉成nvarchar2型別。但是測試是亂碼,例句如下:

SQL> select(selectutl_raw.cast_to_nvarchar2(utl_raw.cast_to_raw('i am nvarchar2string')) from dual) from dual;

(SELECTUTL_RAW.CAST_TO_NVARCHAR2(UTL_RAW.CAST_TO_RAW('IAMNVARCHAR2STRING'))FROMDUAL)
------------------------------------------------------------------------------------------------------------------------------------
??????????

cast_to_raw函式按照預設字符集將varchar2字串轉換為RAW,而cast_to_nvarchar2是將RAW轉換成Nvarchar2型別,nvarchar2依據所選的國家字符集。

SQL> col value formata22                
SQL> select * from nls_database_parameters
  2  where parameterin('NLS_NCHAR_CHARACTERSET','NLS_CHARACTERSET');

PARAMETER                     VALUE
------------------------------ ----------------------
NLS_NCHAR_CHARACTERSET        AL16UTF16
NLS_CHARACTERSET              ZHS16GBK

資料庫預設字符集ZHS16GBK,而國家字符集為AL16UTF16,將ZHS16GBK的RAW用AL16UTF16顯示,會產生亂碼。如果不產生亂碼可以將原字串'iam nvarchar2 string'轉換國家字符集,輸出型別為NVARCHAR2。

SQL> select (selectutl_raw.cast_to_nvarchar2(utl_raw.cast_to_raw(translate('i amnvarchar2 string' using nchar_cs))) from dual) from dual;

(SELECTUTL_RAW.CAST_TO_NVARCHAR2(UTL_RAW.CAST_TO_RAW(TRANSLATE('IAMNVARCHAR2STRING'USINGNCHAR_CS)))FROMDUAL)
------------------------------------------------------------------------------------------------------------------------------------
i am nvarchar2 string

SQL>

問題解決。