0

我刚刚发现,当 Locale 设置为空字符串时,使用 JDBC Thin 驱动程序版本 10.2.0.4 创建与 Oracle 的连接失败,例如:

Locale.setDefault(new Locale("",""));
DriverManager.registerDriver (new oracle.jdbc.driver.OracleDriver());
con = DriverManager.getConnection(url, userName, password);     

上面的代码会产生 ORA-12705: Cannot access NLS data files or invalid environment specified。如果我指定 en US 或仅指定 en,它工作正常。

但是,如果我使用 Oracle 驱动程序 9.2.0.1,则这段代码可以正常工作:NLS 设置为 AMERICAN。

我的问题是:这是正常的、记录在案的行为变化吗?也许将默认语言环境设置为空字符串是一种不好的做法?

4

1 回答 1

0

如果您可以访问 oracle 支持,注释 115001.1 似乎说明从 10g 开始有一些变化:

9i 厚 JDBC (=OCI) 驱动程序将利用 NLS_LANG 来确定如何转换字符。不定义 NLS_LANG 将使它使用默认的 US7ASCII 设置,来自/到数据库的任何非 ASCII 数据都将丢失。

您无需为 Java 代码指定任何内容,以便 JDBC 获取 NLS_LANG。

从 10g 开始,Thick JDBC 驱动程序忽略 NLS_LANG 并使用 JVM 语言环境中的语言、区域和字符集设置。

在 11g 中,属性 -Doracle.jdbc.ociNlsLangBackwardCompatible=true 可在命令上设置。如果设置它会导致 JDBC 从 NLS_LANG 获取字符集,而不是从语言环境获取客户端字符集 ID。

不管属性如何,语言和领土都取自当地。

于 2012-11-12T23:00:45.147 回答