大多数使用Windows命令提示符来运行SQL*Plus命令的用户通常使用一个字符集而这种字符集对于超过ASCII 的位字符范围之外的值就不正确了一旦你尝试从其他欧洲语言进入有特定音符的字符扩展字符就会被翻译错误 举例来说如果在命令提示窗口运行sqlplus默认的字符设置通常是AMERICAN_AMERICAUSASCII(假如你没有特别指定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字符设置应该是USPCUSPC仅仅检索二进制值并试图将它原样的直接地传送到UTF数据库 正确设置NLS_LANG并再次使用这个例子 C:\>set NLS_LANG=AMERICAN_AMERICAUSPC 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_AMERICAUSPC 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字符设置 |