linux下的NLS_LANG该如何设置

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux下的NLS_LANG该如何设置相关的知识,希望对你有一定的参考价值。

Oracle数据库通过select userenv('language') from dual;查获得的是SIMPLIFIED CHINESE_CHINA.ZHS16GBK,通过nls_database_parameters查出的是AMERICAN_AMERICA.ZHS16GBK,他们有啥区别呢,不都应该显示Oracle服务器的字符集么?我现在该如何设置NLS_LANG参数?

1、select * from nls_database_parameters where parameter in ('NLS_LANGUAGE','NLS_TERRITORY','NLS_CHARACTERSET');
2、格式: NLS_LANG=language_territory.charset(语言_地域.字符集),每个成分控制了NLS子集的特性。
Language: 指定服务器消息的语言, 影响提示信息是中文还是英文
Territory: 指定服务器的日期和数字格式,
Charset: 指定字符集。
3、只要第三部分一样就可以相互导入导出数据,前面影响的只是提示信息是中文还是英文。
参考技术A vi /etc/bashrc 把语言设置改成英文吧,不然连接oracle会报错

更改 Oracle 客户端注册表中 NLS_LANG 设置的影响

【中文标题】更改 Oracle 客户端注册表中 NLS_LANG 设置的影响【英文标题】:Effects of changing NLS_LANG setting in the registry for Oracle Client 【发布时间】:2009-11-19 10:27:28 【问题描述】:

我们正在从 .NET Microsoft oracle 驱动程序迁移到 ODP.NET 驱动程序。

我们遇到的问题之一是这个错误:

ORA-12705: 无法访问 NLS 数据文件或指定的环境无效

我们能够通过修改注册表和更改设置来停止错误 (see this question)

在我们的例子中我们改变了

HKEY_LOCAL_MACHINE - SOFTWARE - ORACLE - NLS_LANG

设置为 NA

一样

HKEY_LOCAL_MACHINE - SOFTWARE - ORACLE - HOME0 - NLS_LANG

设置正确

我的问题是为什么注册表中会有不同的 NLS_LANG 设置,更改此值是否会产生任何连锁反应?


更新: 我刚刚在Oracle NLS FAQ下面找到了

对于 Oracle 版本 7:

HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE

对于 Oracle 数据库版本 8、8i 和 9i:

HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOMEx\

其中“x”是唯一编号 识别 Oracle 主目录。

HOME0是第一次安装

对于 Oracle 数据库 10g:

HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_<oracle_home_name>

您有一个带有名称的条目 NLS_LANG

好的,所以不同版本有不同的注册表设置...

注意:

有些人会因为找到一个 NLS_LANG 设置为“NA” HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE 当没有安装版本 7 时。这 用于向后兼容, 并且可以忽略。

我有 Oracle 9i,所以现在我更加困惑 - 为什么 ODP.NET dll 会查看 Oracle 7 注册表设置?

【问题讨论】:

【参考方案1】:

我遇到了类似的问题;

ORA-12705: 无法访问 NLS 数据文件或指定的环境无效

ODP.NET dll 或即时客户端正在读取注册表;

HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\NLS_LANG=NA

值 NA 导致错误。

这是因为我已经安装了客户端,但我想通过网络驱动器将 oracle 即时客户端用于带有 ODP.NET 的 VB.NET 应用程序。

我在 vb.net 解决方案中的简单修复是例如通过以下方式调整应用程序的环境:

Environment.SetEnvironmentVariable("NLS_LANG", 
                    "AMERICAN_AMERICA.WE8MSWIN1252", 
                    EnvironmentVariableTarget.Process)

注意。 Oracle“NLS FAQ”链接不再有效 (2012)

【讨论】:

【参考方案2】:

关于 11g ODP 版本的 PER Oracle Notes,以下可能导致此错误:

HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\NLS_LANG=NA <--- This NA does in fact cause this error if set to NA.

如果不需要,您可以尝试使用 DELETING 密钥,或者将其设置为适合您所在地区的有效 NLS_LANG 设置。

我们将其设置为AMERICAN_AMERICA.WE8MSWIN1252

【讨论】:

【参考方案3】:

在我们的例子中,我们不想对 Oracle 注册表进行任何潜在的破坏性更改,因为我们将 Web 服务安装在生产 Oracle 9i 服务器上。

解决方案只是阻止 ODAC 能够看到任何 ORACLE 注册表项,方法是拒绝对我们的 Web 服务运行所用的用户 ID 的该键进行所有访问。

    开始 -> 运行...regedit (作为管理员) 导航到HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE 右击ORACLE键->权限... 点击添加...按钮。 添加在您的 Web 服务的应用程序池标识中配置的 Web 服务用户名(例如 IUSR_MyWebService);这是在任务管理器中针对 w3wp.exe 进程显示的用户名。 按确定。 对于新用户权限,请在完全控制权限下勾选“拒绝”,然后按确定。

这工作得很好,作为奖励,我们确保我们的应用程序与未来对 ORACLE 注册表项的任何更改隔离。

提示:您可以通过关闭任何正在运行的注册表编辑器实例向自己证明相关用户无权访问相关键,启动CMD 提示as该用户(使用运行方式...),然后从命令提示符启动regedit

【讨论】:

【参考方案4】:

Oracle 客户端 (ORACLE_HOME\bin\ora*.dll) 正在同一目录中查找名为“oracle.key”的文件。此文件包含属于此 Oracle 客户端安装的注册表项的名称。 (例如“软件\ORACLE\HOME3”) hth 安德烈亚斯

【讨论】:

谢谢安德烈亚斯,我不知道。但是我查看了 oracle.key 文件,它具有正确的注册表项 HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME0 这是正确设置 NLS_LANG 的地方,并且我希望 ODP.NET DLL 正在寻找 NLS设置... ODP.NET 是否真的使用 Oracle 9i 客户端目录中的 Oracle 客户端 DLL?您可以使用 SysInternals 的 ProcessExplorer 检查应用程序使用的 DLL。 注意:在 64 位机器上,oracle.key 的内容可能是这样的 SOFTWARE\ORACLE\KEY_OraClient11g_home1 而注册表中的真实位置是 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ORACLE\KEY_OraClient11g_home1 @itsho,是的,当您的应用程序是 32 位版本时就是这种情况。此重定向适用于任何应用程序,请参阅Registry Redirector【参考方案5】:

最终通过安装 ODAC 11 客户端组件(从Oracle website 下载)解决了这一切。我认为系统变得混乱是因为我们复制了 ODAC dll 而不是完全安装客户端。 ODP.NET 期待一个 Oracle 11 客户端,但不知道在哪里可以找到 Oracle Home。

注意,如果您使用 xCopy 部署安装 ODAC 组件,则不要将它们安装到现有的 Oracle 主目录(例如,对于 9i 客户端,c:\oracle\ora92)。这会导致“Provider is not compatible with the version of Oracle Client”错误。

【讨论】:

以上是关于linux下的NLS_LANG该如何设置的主要内容,如果未能解决你的问题,请参考以下文章

linux如何设置软连接??

如何重新设置linux环境变量

Kali Linux安装后该怎么设置

Linux下网卡混杂模式设置和取消

linux下如何设置才能ping通另一网段的主机

如何配置linux下的防火墙?