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

Java OJDBC驱动程序使用客户端区域设置-错误/功能?,java,database,oracle,locale,ojdbc,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.createStateme

如果在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..
现在是我的实际问题。为什么有人会认为这是个好主意?!?这有什么意义?这是一个特性,因为在我看来这是一个bug,或者至少是非常糟糕的设计/概念

问候,,
Colin

这应该是jdbc驱动程序的特性

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

对于oracle,在处理时间戳类型的列以及如何将它们映射到java时,还必须小心


我认为,驱动程序使用客户的首选项是有道理的——毕竟数据就是在这里显示的。如果使用SQL*Plus,您会得到什么?如果我没记错的话,它也使用了客户端的语言环境。我想我试过使用SQL Plus,现在是服务器时间。是的,也许这是一个你期望它是什么的问题。如果使用像JavaScript这样的技术,我永远不会期望某些东西是基于服务器的,如果使用DB技术,我永远不会期望某些东西是基于客户端的。但那可能就是我……事实上,它不仅影响应用程序的其他部分,还影响JVM中运行的每一段Java代码。我知道Locale.setDefault会影响整个JVM。这正是我想要的。仍然看不到关于OJDBC驱动程序行为的赞成论据。事实上,甚至相反,在你发布的最佳实践链接中,他们说:1。永远不要相信客户机日期时间。这很可能是错误的。2.不要将客户端日期时间与服务器日期时间进行比较。另外两个论点是为什么这种行为是非常错误的,或者在我看来是错误的。。。