我的 Win-2003 机器上运行着 informix 11.5,其中还运行着一些数据库。
系统数据库的语言环境为 en_us.819,而
我的自定义数据库的语言环境为 en_us.57372 (UTF8)。
还有部署到 JBoss 4.0.2 的应用程序,它为这些自定义数据库配置了一些数据源。
<local-tx-datasource>
<jndi-name>InformixDS</jndi-name>
<connection-url>jdbc:informix-sqli://@database.server@:@database.port@/tcs_catalog:[email protected]@</connection-url>
<driver-class>com.informix.jdbc.IfxDriver</driver-class>
<user-name>@database.username@</user-name>
<password>@database.password@</password>
<new-connection-sql>set lock mode to wait 5</new-connection-sql>
<check-valid-connection-sql>select '1' from dual</check-valid-connection-sql>
<metadata>
<type-mapping>InformixDB</type-mapping>
</metadata>
我以管理员身份登录,当我启动 JBoss 时显示以下错误
Caused by: java.sql.SQLException: Database locale information mismatch.
at com.informix.util.IfxErrMsg.getSQLException(IfxErrMsg.java:373)
at com.informix.jdbc.IfxSqli.a(IfxSqli.java:3208)
at com.informix.jdbc.IfxSqli.E(IfxSqli.java:3518)
at com.informix.jdbc.IfxSqli.dispatchMsg(IfxSqli.java:2353)
at com.informix.jdbc.IfxSqli.receiveMessage(IfxSqli.java:2269)
at com.informix.jdbc.IfxSqli.executeOpenDatabase(IfxSqli.java:1786)
at com.informix.jdbc.IfxSqliConnect.<init>(IfxSqliConnect.java:1327)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:501)
at com.informix.jdbc.IfxDriver.connect(IfxDriver.java:254)
at org.jboss.resource.adapter.jdbc.local.LocalManagedConnectionFactory.createManagedConnection(LocalManagedConnectionFactory.java:151)
... 160 more
Caused by: java.sql.SQLException
at com.informix.util.IfxErrMsg.getSQLException(IfxErrMsg.java:373)
at com.informix.jdbc.IfxSqli.E(IfxSqli.java:3523)
... 170 more
对于管理员,DB_LOCALE 和 CLIENT_LOCALE 设置为 en_us.utf8。
当我在 Server Studio 中将 DB_LOCALE 和 CLIENT_LOCALE 设置为 en_us.utf8 时,我可以连接我的数据库。
我应该在哪里设置 DB_LOCALE 和 CLIENT_LOCALE 以避免出现这种情况数据库区域信息不匹配错误?
谢谢。
答案1
根据 Guy Bowerman 在其网站上发表的评论回复 #5 和 #11博客
...您需要在执行 oninit 命令启动服务器之前在环境中设置它(在 UNIX 上)。如果服务器在 Windows 上,您还可以在注册表中设置变量:HKEY_LOCAL_MACHINE\Software\Informix\Online\%INFORMIXSERVER%\Environment
解决方法是改变两个都注册表中 CLIENT_LOCALE 从默认的“EN_US.CP1252”修改为“EN_US.CP1252”,DB_LOCALE 从默认的“EN_US.8859-1”修改为“EN_US.UTF8”。
答案2
您可以在 JDBC 数据库 URL 中设置 DB_LOCALE 和 CLIENT_LOCALE。请查看我的 Jython 代码:https://stackoverflow.com/questions/464567/how-to-get-trailing-spaces-from-varchar-column-in-informix-using-odbc。对于波兰语言环境,我使用如下 URL:
jdbc:informix-sqli://127:0:0:1:9088/test_td:informixserver=ol_mn;DB_LOCALE=pl_PL.CP1250;CLIENT_LOCALE=pl_PL.CP1250;charSet=CP1250