我的環境是RH linux 4,資料庫oracle 10.2,字元集是AL32UTF8。現象是這樣的:用select查看原資料,中文顯示亂碼,但java應用程式顯示正常。從linux上用sqlplus插入一條中文,再用select 查詢,新插入的這條中文顯示正常,但java應用程式查詢不出來。資料庫字元集用的utf8,看了一下nls_lang的設定是NLS_LANG=american_america.AL32UTF8; 於是改成了NLS_LANG=american_america.UTF8(編輯並運行.bash_profile),重新插入資料,用select查看,中文顯示亂碼,但java應用程式顯示正常。再修改NLS_LANG=american_america.ZHS16GBK,用select查詢,中文顯示正常。
今天又遇到了從sql plus insert 中文的問題,主要還是nls_lang的設定,總結一下。
首先要明確什麼是字元集。字元集是一個位元組資料的解釋的符號集合,有大小之分,有相互的包括關係,如us7ascii就是zhs16gbk的子集, 從us7ascii到zhs16gbk不會有資料解釋上的問題,不會有資料丟失,Oracle對這種問題也要求從子集到超集的匯出受支援,反之不行。在所有的字元集中utf8應該是最大,因為它基於unicode,雙位元組儲存字元(也因此在儲存空間上佔用更多)。
其次,一旦資料庫建立後,資料庫的字元集是不能改變的。因此,在設計和安裝之初考慮使用哪一種字元集是十分重要的。資料庫字元集應該是作業系統本地字元集的一個超集。存取資料庫的客戶使用的字元集將決定選擇哪一個超集,即資料庫字元集應該是所有客戶字元集的超集。
現在,介紹一些與字元集有關的NLS_LANG參數,
NLS_LANG格式:
NLS_LANG = language_territory.charset
有三個組成部分(語言、地區和字元集),每個成分控制了NLS子集的特性。其中:language 指定伺服器訊息的語言。
territory 指定伺服器的日期和數字格式。
charset 指定字元集
例如:
AMERICAN_AMERICA.US7SCII
AMERICAN _ AMERICA. ZHS16GBK
還有一些子集可以更明確定義NLS_LANG參數:
DICT.BASE 資料字典基本 表版本
DBTIMEZONE 資料庫時區
NLS_LANGUAGE 語言
NLS_TERRITORY 地區
NLS_CURRENCY 本地貨幣字元
NLS_ISO_CURRENCY ISO貨幣字元
NLS_NUMERIC_CHARACTERS 小數字元和組 分隔開
NLS_CHARACTERSET 字元集
NLS_CALENDAR 日曆系統
NLS_DATE_FORMAT 預設的日期格式
NLS_DATE_LANGUAGE 預設的日期語言
NLS_SORT 字元排序序列
NLS_TIME_FORMAT 時間格式
NLS_TIMESTAMP_FORMAT 時間戳記格式
……
查看可選的資料庫字元集:
col nls_charset_id for 99999
col nls_charset_name for a35
col hex_id for a5
select nls_charset_id(value) nls_charset_id,value nls_charset_name,to_char(nls_charset_id (value),'xxxx') hex_id
from v$nls_valid_values
where parameter = 'CHARACTERSET';
查看當前資料庫字元集配置:
col parameter for a35
col value for a35
select * from v$nls_parameters;
或者:
select * from sys.props$;
本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/wzy0623/archive/2007/06/26/1666769.aspx