大多數使用Windows命令提示符來運行SQL*Plus命令的用戶通常使用一個字符集
而這種字符集對於超過ASCII 的
位字符范圍之外的值就不正確了
一旦你嘗試從其他歐洲語言進入有特定音符的字符
擴展字符就會被翻譯錯誤
舉例來說
如果在命令提示窗口運行sqlplus
默認的字符設置通常是AMERICAN_AMERICA
US
ASCII(假如你沒有特別指定NLS_LANG字符設置)
如果你將resume字樣鍵入SQL*Plus提示符中
你將看到如下
sqlplus
s scott/tiger
select
resume
from dual;
RESUME
resume
問題是
Windows命令提示符本質上類似於DOS
它繼承了代碼頁的全球語言支持(NLS)
你可以在控制台提示符中鍵入chcp命令來查看你目前的代碼頁是什麼
C:\>chcp
Active code page:
在這個例子中
我們使用了
號代碼頁和一個美式鍵盤
因此確切的NLS_LANG字符設置應該是
US
PC
US
PC
僅僅檢索二進制值並試圖將它原樣的直接地傳送到UTF
數據庫
正確設置NLS_LANG並再次使用這個例子
C:\>set NLS_LANG=AMERICAN_AMERICA
US
PC
C:\>sqlplus
s scott/tiger
select
resume
from dual;
RESUME
resume
在Windows中
有一點非常重要
那就是給像SQL*Loader這樣的程序以及撰寫SQL*Plus腳本(其中可能使用非ASCII字符)保留NLS_LANG變量設置
特別是如果你的編輯器使用的是和DOS/OEM一樣的字體
因為它們將和你的代碼頁設置一致
NLS_LANG對插入數據也有影響
譬如說
set NLS_LANG=
sqlplus
s scott/tiger
create table text (a varchar
(
));
insert into text values (
resume
);
exit;
set NLS_LANG=AMERICAN_AMERICA
US
PC
sqlplus
s scott/tiger
insert into text values (
resume
);
select a from text;
A
resume
resume
select dump(a) from text;
DUMP(A)
Typ=
Len=
:
Typ=
Len=
:
第一個字節是不正確的
當然並不是有意的
你可以根據需要從Oracle聯機文件中查閱正確的NLS_LANG字符設置
From:http://tw.wingwit.com/Article/os/xtgl/201311/9375.html