暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle PRO * C应用的NLS_LANG配置

ASKTOM 2020-10-19
619

问题描述

嗨,大师们,

我的Pro * C应用程序有问题。

我的操作系统-> RedHat版本5.5 (Tikanga)

我的数据库;

甲骨文数据库11g企业版11.2.0.3.0-64bit生产
PL/SQL版本11.2.0.3.0-生产
核心11.2.0.3.0
生产
TNS for Linux: Version 11.2.0.3.0 - 生产
NLSRTL Version 11.2.0.3.0 - 生产

Nls _ 参数;

Nls _ 语言AMERICAN
Nls _ 领土AMERICA
Nls _ 货币 $
Nls_iso _ 货币美国
NLS_NUMERIC_CHARACTERS。,
Nls _ 日历格里高利
日期格式DD-MON-RR
美国语言
Nls_characterrsetWE8ISO8859P9
Nls _ 排序二进制
时间格式HH.MI.SSXFF AM
NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR
NLS_DUAL_CURRENCY $
NLS_NCHAR_CHARACTERSET AL16UTF16
NLS_COMP二进制
Nls_length _ 语义字节
Nls_nchar_conv_exp假

在我运行我的C应用程序之前,我设置NLS_LANG。例如;

出口NLS_LANG = 美国 _ 美国.Utf8

我在unix终端上运行appl->
./app sqlstmt"select * from mus_test_char"
复制


以user: mus/mus123 @ orcl的身份连接到甲骨文
卸载 “从must_test_char中选择 *”
数组大小 = 10
IDD,文本
"1" |"(null)"

如果我导出NLS_LANG = 美国 _ 美国.We8iso8859p9

我跑了
./app sqlstmt"select * from mus_test_char" 
复制


以user: mus/mus123 @ orcl的身份连接到甲骨文
卸载 “从must_test_char中选择 *”
数组大小 = 10
IDD,文本
"1" |"▒aaaa▒aaaaa▒aaaaa▒aaaaa▒aaaaa▒aaaaa▒aaaa▒aaa"
提取1行

如果我取消设置NLS_LANG -> 取消设置NLS_LANG

我跑了->
./app sqlstmt"select * from mus_test_char"
复制


以user: mus/mus123 @ orcl的身份连接到甲骨文
卸载 “从must_test_char中选择 *”
数组大小 = 10
IDD,文本
"1" |"Saaaa?aaaaaUaaaaaOaaaaaCaaaaa?aaaaa?aaaaoaaa"
提取1行


我在数据库中的原始数据如下;

1个

你能帮我解决这个问题吗?

编辑:

我尝试了我的应用程序另一个数据库。这是NLS设置,美国 _ 美国
我在我的客户端NLS_LANG = AMERICAN_AMERICA.UTF8上设置

然后我在那台机器上运行我的应用程序,我得到正确的值 ..

1个


谢谢。

专家解答


当您在Unix终端或此类终端的PC仿真器上运行Pro * C应用程序时,必须确保NLS_LANG的字符集与配置终端/仿真器的字符编码相对应。终端和仿真器太多了,我无法告诉如何直接检查此配置。但是,您可以尝试类似的方法:

$ od -t x1


复制


这将显示类似的内容:

0000000 c5 9e 0a
0000003
复制


如果您看到 'c5 9e 0a',那么您的终端配置为utf-8,NLS_LANG应该是。AL32UTF8。如果你看到 'de 0a',那么你的终端配置为iso8859-9,NLS_LANG应该是WE8ISO8859P9

无论如何,如果您的数据库字符集NLS_CHARACTERSET是AL32UTF8,并且您选择您的列值为

SELECT DUMP(text,1016) FROM mus_test_char
复制


那么你应该在列值中看到对应于 'ş '的 'c5,9e'。如果你的数据库字符集NLS_CHARACTERSET是WE8ISO8859P9,那么你应该看到 'de'。如果您看到其他代码,那么仍然存在配置问题。所谓的直通配置 (NLS_LANG = NLS_CHARACTERSET) 有时可以通过正确显示字符来欺骗人们,而实际上它们在数据库中编码不正确。



文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论