确定Oracle会话客户端字符集?


9

知道数据库字符集(NLS_CHARACTERSET中的select * from v$nls_parameters;)和客户端字符集(客户端环境设置NLS_LANG)如何交互。

但是,我无法确定的是,对于已建立的会话,如何或是否可以确定Oracle认为当前客户端特征集是什么。

这有可能吗?

注:SELECT * FROM NLS_SESSION_PARAMETERS;包含字符集(上10G2)。

明确说明我要完成的工作:

  1. NLS_LANG在客户端环境中设置为任意值(例如GERMAN_GERMANY.WE8MSWIN1252
  2. 数据库应用程序[*]启动并建立与Oracle数据库的连接/会话。
  3. 数据库应用程序[*]希望“询问” Oracle(而不是其OS环境)Oracle将承担的客户端字符集。

[*]:如果数据库应用程序是sqlplus,则示例如下所示:

...
sqlplus /nolog
connect user/pass@example
*magic command*;
   CLIENT CHARACTERSET = ...

杰克的回答中提出了两个要点:

  • 借助Oracle,做的字符集转换。它是客户端库代码还是在服务器端完成?
  • 看起来是客户端,客户端需要公开此设置-客户端库/工具假定此设置是什么。是否可以查询任何Oracle客户端库/工具(sqlplus,OCI / OCCI,Pro * C等)?

Answers:


9

我有点怀疑这正是您要寻找的东西,但是

host echo %nls_lang%;

ENGLISH_UNITED KINGDOM.WE8ISO8859P1

显示客户端上的客户端nls_lang环境变量。

我不认为可以运行SQL查询来提供“当前”设置,因为AFAIK服务器不知道客户端执行了什么转换,因此任何显示当前设置的命令都必须是本机的到客户端-我对上述命令使用了SQL Developer,但我认为它在SQL * Plus中的工作原理相同

- 编辑

来自AskTom

只有客户也知道他们的字符集-“在数据库中”不可用

字符集描述存储在数据库中的内容。

客户通过NLS_LANG设置将所需的翻译成字符知道的信息传递给数据库。

如果您使用的是11.1以上版本,则可能对 v $ session_connect_info 感到满意,因为:

OCI在登录时将这些信息推送到服务器。

但是我发现它仍然取决于您的连接方式,例如从JDBC Thin Driver中您不使用OCI,因此信息不会被推送


好吧,不,这不是我一直在寻找的东西:-)-但是您提出了(两个)重要点,如果是真的,我想这将是一个可以接受的答案。我将这两点添加到问题中。
马丁

呸! (不要怪你)但是Oracle确实拥有它:“只有客户端也知道他们的字符集 - 在“数据库中”不可用,并且“客户端通过...使数据库知道... NLS_LANG”真的很反面,不是吗?:-)
马丁

是的,尽管您是汤姆<> Oracle,但您是正确的。我认为他在说话时绊脚石-整个
话题

1
第一个链接的已接受答案-因为有关Ask Ask(来自2002年)的问题实际上是在问同样的事情,“我想知道是否有可能在连接到v $或nls_视图中的任何一个后检查客户端NLS_LANG设置数据库。”
马丁

0

您可以看到以下内容

  • NLS_CALENDAR
  • NLS_CURRENCY
  • NLS_DATE_FORMAT
  • NLS_DATE_LANGUAGE
  • NLS_SORT
  • NLS_TERRITORY

例如:

SQL> select sys_context('USERENV', 'NLS_TERRITORY') from dual;

SYS_CONTEXT('USERENV','NLS_TERRITORY')
--------------------------------------------------------------------------------
UNITED KINGDOM

1 row selected.

我猜这里提到sys_context是有用的。否则,这将无法解决哪个字符集的问题。
马丁

我的观点是,是服务器唯一了解(或关心)的事情。
Gaius
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.