OJDBC驱动程序使用客户端区域设置 - 错误/功能?

时间:2014-08-13 14:41:17

标签: java database oracle locale ojdbc

如果您在toad中针对oracle DB运行此查询:

select 
to_char(TRUNC(sysdate, 'DAY'),'DAY') start_of_the_week
from dual;

根据区域设置服务器设置,您将获得:

Sunday --EN, USA
Monday -- DE, GERMANY

这很有道理,也很好。

如果你通过OJDBC驱动程序在Java中执行完全相同的操作:

//....
Statement stm = JDBCConn.createStatement();
stm.execute("select to_char(TRUNC(sysdate, 'DAY'),'DAY') start_of_the_week from dual");
stm.getResultSet().next();
System.out.println(stm.getResultSet().getString("start_of_the_week"));

您将返回星期日或星期一,但这取决于您运行此语句的JVM提供的客户端本地设置。这意味着您获得的答案不再取决于服务器本地设置,而是取决于您的客户端设置。

修复非常简单,添加

Locale.setDefault(new Locale("EN", "US", "WIN")); //or German etc..

现在我的实际问题。为什么有人会认为这是个好主意?!?有没有这种情况有意义的情况?这是一个功能,因为在我看来这是一个错误,或者至少是非常糟糕的设计/概念。

此致 科林

1 个答案:

答案 0 :(得分:0)

这应该是jdbc驱动程序功能

小心Locale.setDefault - 设置jvm默认值,这会影响应用程序的其他部分

使用oracle在处理时间戳类列以及如何将它们映射到java时也必须小心

请参阅 http://tonyhasler.wordpress.com/2010/09/04/tonys-tirade-against-timestamp-with-time-zone/

Daylight saving time and time zone best practices

In the Oracle JDBC driver, what happens to the time zone when you write a Java date to a TIMESTAMP column?