我知道数据库字符集(NLS_CHARACTERSET
in select * from v$nls_parameters;
)和客户端字符集(客户端环境设置NLS_LANG
)如何交互。
但是,我无法找到的是,对于已建立的会话,我如何或是否可以确定 Oracle 认为当前客户端字符集是什么。
这可能吗?
注意:SELECT * FROM NLS_SESSION_PARAMETERS;
不包括字符集(在 10g2 上)。
为了明确我想要完成的工作:
- NLS_LANG 在客户端环境中设置为任意值(例如
GERMAN_GERMANY.WE8MSWIN1252
) - 数据库应用程序[*] 启动并建立到 Oracle 数据库的连接/会话。
- 数据库应用程序[*] 想要“询问” Oracle(而不是其操作系统环境)客户端字符集是 Oracle 将假定的。
[*]:如果 db 应用程序是 sqlplus,则示例如下所示:
...
sqlplus /nolog
connect user/pass@example
*magic command*;
CLIENT CHARACTERSET = ...
杰克在回答中的注释提出了两个重要的观点:
- 使用 Oracle,谁做字符集翻译。它是客户端库代码还是在服务器端完成的?
- 看起来它是客户端,客户端需要公开此设置——客户端库/工具假定此设置是什么。是否有任何 Oracle 客户端库/工具(sqlplus、OCI/OCCI、Pro*C、...)可以查询它认为该设置是什么?
我有点怀疑这正是您正在寻找的东西,但是
显示客户端上的客户端 nls_lang 环境变量。
我不认为您可以运行 SQL 查询来提供“当前”设置,因为 AFAIK 服务器不知道客户端完成了什么翻译,因此任何显示当前设置的命令都必须是本机的到客户端 - 我使用 SQL Developer 执行上述命令,但我认为它在 SQL*Plus 中的工作方式相同
- 编辑
来自 AskTom:
和
如果您使用的是 11.1+,您可能会对v$session_connect_info 感到满意,因为:
但我发现它仍然取决于您的连接方式,例如从 JDBC Thin Driver 您没有使用 OCI,因此不会推送信息
您可以看到以下内容:
例如: