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 德语字符被转换为垃圾字符?的主要内容,如果未能解决你的问题,请参考以下文章