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

Mar*_*tin 9 oracle character-set

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

然而,我不知道的是,我如何或是否可以确定, 对于已建立的会话,Oracle 认为当前客户端字符集是什么。

这可能吗?

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

完全清楚我想完成什么:

  1. NLS_LANG 在客户端环境中设置为任意值(例如 GERMAN_GERMANY.WE8MSWIN1252
  2. 数据库应用程序[*] 启动并建立到 Oracle 数据库的连接/会话。
  3. 数据库应用程序[*] 想“询问” Oracle(而不是其操作系统环境)Oracle 将假设的客户端字符集是什么。

[*]:如果db应用程序是sqlplus,示例如下:

...
sqlplus /nolog
connect user/pass@example
*magic command*;
   CLIENT CHARACTERSET = ...
Run Code Online (Sandbox Code Playgroud)

杰克在他的回答中的注释提出了两个要点:

  • 与甲骨文,做的字符集转换。它是客户端库代码还是在服务器端完成?
  • 由于它似乎是客户端,因此客户端需要公开此设置——客户端库/工具假定此设置是什么。是否有任何 Oracle 客户端库/工具(sqlplus、OCI/OCCI、Pro*C、...)可以查询它认为此设置是什么?

Jac*_*las 9

我有点怀疑这正是你要找的,但是

host echo %nls_lang%;

ENGLISH_UNITED KINGDOM.WE8ISO8859P1
Run Code Online (Sandbox Code Playgroud)

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

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

- 编辑

来自 AskTom

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

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

客户端通过 NLS_LANG 设置将他们想要的翻译成字符知道 [原文如此] 到数据库。

如果您使用的是 11.1+,您可能会对v$session_connect_info感到高兴,因为:

此信息在登录时由 OCI 推送到服务器。

但我发现它仍然取决于您的连接方式,例如从您没有使用 OCI 的 JDBC 瘦驱动程序,因此不会推送信息