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

Posted

技术标签:

【中文标题】Oracle 德语字符被转换为垃圾字符?【英文标题】:Oracle german character are converted to junk character? 【发布时间】:2017-02-03 07:38:45 【问题描述】:

我创建了一个简单的表,它只有一个字段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

这里显示的输出是正确的。

我到现在为止的尝试。

    我检查了文件格式,它必须是 utf-8 我检查了 NLS_charset,它是 AL32UTF8。

我期待什么?

    当我从 sqldeveloper 运行相同的文件时,我得到了正确的输出。

我想从 .sql 文件运行相同的脚本,并希望在数据库中保留原始文件中的德语字符。

【问题讨论】:

如果这些字符在 SQL Developer 中正确显示,则它们在数据库中存储正确。 SQL*Plus 不能正确显示它们的事实意味着您的控制台字体不支持这些字符(或 UTF-8)。另一种选择是 SQL*Plus 的 NLS 环境配置不正确。您使用的是哪种操作系统? 我们使用的是windows7.当我们从 sqldeveloper 运行文件时,数据没有正确存储,我们得到正确的输出,但是当我们从 sqlplus 运行相同的文件时,得到奇怪的输出。 NLS_LANG 的正确值是多少?我目前已经尝试过这一套 NLS_LANG=AMERICAN_AMERICA.AL32UTF8 活动代码页为 437 让我们continue this discussion in chat。 【参考方案1】:

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

简而言之,你需要:

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

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

现在代码页与 NLS_LANG 设置匹配:

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

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

【讨论】:

这不起作用,当我设置 chcp 65001 并尝试运行 sql 查询时,数据库会自动退出。当尝试运行 .sql 文件时,它会抛出异常 SP2-0734: unknown command started "insert in..." - 其余行被忽略。 SQL> select * from test; @MaheshwarLigade:听起来好像您的 SQL 脚本是使用 UTF8 BOM 存储的,我认为 SQL*Plus 不支持该功能 @MaheshwarLigade:当然不是,那是 Windows 命令。您说您使用的是 Windows 7。 我在 windows7 上使用它,现在我想要在 unix 上运行良好。

以上是关于Oracle 德语字符被转换为垃圾字符?的主要内容,如果未能解决你的问题,请参考以下文章

oracle 将字符型转换为数值型

德语特殊字符在 WordPress 架构中不起作用

oracle怎么把数值型日期转换成日期字符型

Oracle字符类型与数值类型的转换

从字符串转换为 unsigned char* 会留下垃圾

浏览器显示德语字符问题