D2002 发表于 2012-04-20 12:48

请教一个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?

liaosnet 发表于 2012-04-20 13:49

你这里只有linux环境下使用jdbc访问出错,也许只跟GBK编码有关,你把这个环境的LANG改成zh_CN.GBk再试下。。

D2002 发表于 2012-04-20 14:11

本帖最后由 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程序,汉字显示是乱码的。

liaosnet 发表于 2012-04-20 14:27

回复 3# D2002


    esqlc 与jdbc的在处理字符的时候机制有些不一样。esqlc的时候(含dbaccess)实际使用的是en_US.819来显示中文字符的,而使用了jdbc,由于newcodeset的原因(指定了GBK),而当前环境中使用的是en_US.819,导致不能将GBK转换成819转换。。

D2002 发表于 2012-04-20 14:32

本帖最后由 D2002 于 2012-04-20 14:35 编辑

回复 4# liaosnet


       再次感谢!
       觉得JDBC方式使用汉字有点复杂。
       在URL中去掉NEWCODESET项目(不设置NEWCODESET), 也就是缺省方式,用JDBC方式汉字也显示乱码,另外如何将NEWCODESET设置成en_US.819方式?

liaosnet 发表于 2012-04-20 14:46

回复 5# D2002


    不设置 newcodeset默认就是819。
    如果不使用newcodeset,似乎本地也法正常显示的(可能与jdbc本身有关)

D2002 发表于 2012-04-20 14:57

回复 6# liaosnet


    谢谢,以后有问题再请教

D2002 发表于 2012-04-23 09:23

本帖最后由 D2002 于 2012-04-23 14:40 编辑

碰到字段中有汉字乱码的情况,JDBC会异常中断的

D2002 发表于 2012-04-23 14:35

本帖最后由 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程序那样就不检测,仅仅对应字符输出?




liaosnet 发表于 2012-04-23 18:40

回复 9# D2002


    这个是半中文字符问题,似乎没什么好的办法。。自己控制好数据库里的值 吧。。。
页: [1] 2
查看完整版本: 请教一个JDBC方式连接到IDS的汉字码问题