请教一个JDBC方式连接到IDS的汉字码问题
本帖最后由 D2002 于 2012-04-20 13:28 编辑1) JDBC URL 是这样的:
jdbc:informix-sqli://198.1.1.100:6001/TestDB:INFORMIXSERVER=dbserver;USER=informix; PASSWORD=password;NEWCODESET=GBK,8859-1,819
2) 数据库 ‘TestDB’ 的NLS 是缺省方式:
NLS Capabilities and Attributes
en_US.819 Collating Sequence
en_US.819 Ctype
3) 版本:
(1) IDS 11.50.FC9 for Linux, 以及随IDS 11.50包安装的JDBC Driver 版本
(2) Windows xp 下是最新的JDBC Driver 3.7
(3) JDK 都是 JDK1.7.0_03
4) Linux 下测试(与数据库服务器同一台机器):
环境变量:LANG=english_us.8859
(关于数据库语言相关的环境变量都没设置!!!)
(1) 用dbaccess中(sql: select)访问数据库表,汉字显示正常
(2) 用ESQL/C 程序(sql: select/insert)访问数据库表,汉字显示正常
(3) 用JDBC方式(sql: select)访问数据库表(URL见第1项), 汉字就出现乱码
5) Windows xp 下测试:
用JDBC方式(sql: select)访问数据库表(URL见第1项), 汉字显示正常
(关于数据库语言相关的环境变量都没设置!!!)
如果 JDBC URL 中的NEWCODESET=GBK,8859-1,819部分去掉进行测试,那么也出现汉字乱码
不知道什么地方出问题了?是不是要把数据库的NLS设置成8859-1? 你这里只有linux环境下使用jdbc访问出错,也许只跟GBK编码有关,你把这个环境的LANG改成zh_CN.GBk再试下。。 本帖最后由 D2002 于 2012-04-20 14:20 编辑
回复 2# liaosnet
谢谢!
测试了一下,在Linux下设置LANG=zh_CN.GBK后,JDBC程序方式访问IDS,汉字显示正常了(ESQL/C以及dbaccess访问数据表,汉字显示也正常)
同样在Linux环境下(同一个目录下), 设置LANG=english_8859,运行esql/c 程序(含select/insert语句)以及运行dbaccess, 汉字存取都是正常的,而运行JDBC程序,汉字显示是乱码的。
回复 3# D2002
esqlc 与jdbc的在处理字符的时候机制有些不一样。esqlc的时候(含dbaccess)实际使用的是en_US.819来显示中文字符的,而使用了jdbc,由于newcodeset的原因(指定了GBK),而当前环境中使用的是en_US.819,导致不能将GBK转换成819转换。。 本帖最后由 D2002 于 2012-04-20 14:35 编辑
回复 4# liaosnet
再次感谢!
觉得JDBC方式使用汉字有点复杂。
在URL中去掉NEWCODESET项目(不设置NEWCODESET), 也就是缺省方式,用JDBC方式汉字也显示乱码,另外如何将NEWCODESET设置成en_US.819方式? 回复 5# D2002
不设置 newcodeset默认就是819。
如果不使用newcodeset,似乎本地也法正常显示的(可能与jdbc本身有关) 回复 6# liaosnet
谢谢,以后有问题再请教 本帖最后由 D2002 于 2012-04-23 14:40 编辑
碰到字段中有汉字乱码的情况,JDBC会异常中断的 本帖最后由 D2002 于 2012-04-23 14:45 编辑
回复 6# liaosnet
再请教一个问题:(Linux与Windows下均存在这个问题)
Linux下环境变量设置成:LANG=zh_CN.GBK
在JDBC中,一旦select某一个字段的值后半段是乱码(比如半个汉字的情况), JDBC SQLException就会出现这样的一个错误信息:"Encoding or code set not supported"
不知道怎么检测到,以致程序不这样异常中断。
下面是JDBC应用中最简单的部分代码:
Statement stmt =null;
......
try {
stmt = conn.createStatement();
String query = "select cust_no, cust_name from customers;";
ResultSet r = stmt.executeQuery(query);
String p1 = null;
String p2 = null;
int rows = 1;
while ( r.next() ) {
p1 = r.getString("cust_no");
p2 = r.getString("cust_name");
System.out.println("Rows: " + rows);
System.out.println(" Customer's No. [" + p1.trim() + "]");
System.out.println(" Customer's Name [" + p2.trim() + "]");
rows++;
}
r.close();
stmt.close();
}
catch (SQLException e) {
System.out.println("FAILED: Fetch statement failed: " + e.getMessage());
}
......
运行过程中,一旦碰到cust_name中值有半个汉字情况, 就会出现:
FAILED: Fetch statement failed: Encoding or code set not supported.
应该如何检测到这种情况,或者像dbacces或者esql/c程序那样就不检测,仅仅对应字符输出?
回复 9# D2002
这个是半中文字符问题,似乎没什么好的办法。。自己控制好数据库里的值 吧。。。
页:
[1]
2