Oracle德语字符转换为垃圾字符?

时间:2017-02-03 07:38:46

标签: windows oracle character-encoding sqlplus

我创建了一个只有一个字段TCHAR

的简单表
SQL> desc test;
 Name                                      Null?    Type
 ----------------------------------------- -------- --------------

 TCHAR                                              CHAR(20)

我创建了一个.sql文件并使用sqlplus运行sql脚本 @filepath..\germantest.sql然后输出被一些垃圾词取代

输出:

SQL> select * from test;

TCHAR
--------------------
Ä
Wir bestß
Nauch à â Ý

但是当我尝试直接在sqlplus而不是文件上插入相同的数据时,

输入

insert into test values('Ärger Ökonom');
insert into test values('Ä');
insert into test values('Wir bestß');
insert into test values('Nauch à â Ý');

输出

SQL> select * from test;

TCHAR
--------------------
Ärger Ökonom
Ä
Wir bestß
Nauch à â Y

此处显示的输出是正确的。

到目前为止我一直在尝试。

  1. 我检查了文件格式,必须是utf-8
  2. 我检查了NLS_charset,它是AL32UTF8。
  3. 我期待什么?

    1. 当我从sqldeveloper运行相同的文件时,我得到了正确的输出。
    2. 我想从.sql文件运行相同的脚本,并希望在原始文件中保留数据库中的德语字符。

1 个答案:

答案 0 :(得分:2)

Windows控制台中的代码页必须与SQL * Plus的NLS_LANG设置匹配。

简而言之,您需要:

c:\> chcp 65001
c:\> SET NLS_LANG=GERMAN_GERMANY.AL32UTF8

如果在控制台中运行type germantest.sql,则可以轻松验证代码页是否正确。如果没有正确显示文件内容,则代码页错误:

enter image description here

现在,代码页以匹配NLS_LANG设置:

enter image description here

运行SQL脚本时,NLS_LANG的正确值也很重要,因为它确定了SQL * Plus读取文件的编码。

当然cmd.exe需要配置为使用可以实际显示这些字符的字体。