免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4636 | 回复: 10
打印 上一主题 下一主题

请教一个JDBC方式连接到IDS的汉字码问题 [复制链接]

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:15数据库技术版块每日发帖之星
日期:2015-11-26 06:20:00数据库技术版块每日发帖之星
日期:2016-02-25 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-04-20 12:48 |只看该作者 |倒序浏览
本帖最后由 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?

论坛徽章:
11
金牛座
日期:2015-03-19 16:56:22数据库技术版块每日发帖之星
日期:2016-08-02 06:20:00数据库技术版块每日发帖之星
日期:2016-04-24 06:20:00数据库技术版块每日发帖之星
日期:2016-04-13 06:20:00IT运维版块每日发帖之星
日期:2016-04-13 06:20:00数据库技术版块每日发帖之星
日期:2016-02-03 06:20:00数据库技术版块每日发帖之星
日期:2015-08-06 06:20:00季节之章:春
日期:2015-03-27 15:54:57羊年新春福章
日期:2015-03-27 15:54:37戌狗
日期:2015-03-19 16:56:41数据库技术版块每日发帖之星
日期:2016-08-18 06:20:00
2 [报告]
发表于 2012-04-20 13:49 |只看该作者
你这里只有linux环境下使用jdbc访问出错,也许只跟GBK编码有关,你把这个环境的LANG改成zh_CN.GBk再试下。。

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:15数据库技术版块每日发帖之星
日期:2015-11-26 06:20:00数据库技术版块每日发帖之星
日期:2016-02-25 06:20:00
3 [报告]
发表于 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程序,汉字显示是乱码的。

论坛徽章:
11
金牛座
日期:2015-03-19 16:56:22数据库技术版块每日发帖之星
日期:2016-08-02 06:20:00数据库技术版块每日发帖之星
日期:2016-04-24 06:20:00数据库技术版块每日发帖之星
日期:2016-04-13 06:20:00IT运维版块每日发帖之星
日期:2016-04-13 06:20:00数据库技术版块每日发帖之星
日期:2016-02-03 06:20:00数据库技术版块每日发帖之星
日期:2015-08-06 06:20:00季节之章:春
日期:2015-03-27 15:54:57羊年新春福章
日期:2015-03-27 15:54:37戌狗
日期:2015-03-19 16:56:41数据库技术版块每日发帖之星
日期:2016-08-18 06:20:00
4 [报告]
发表于 2012-04-20 14:27 |只看该作者
回复 3# D2002


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

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:15数据库技术版块每日发帖之星
日期:2015-11-26 06:20:00数据库技术版块每日发帖之星
日期:2016-02-25 06:20:00
5 [报告]
发表于 2012-04-20 14:32 |只看该作者
本帖最后由 D2002 于 2012-04-20 14:35 编辑

回复 4# liaosnet


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

论坛徽章:
11
金牛座
日期:2015-03-19 16:56:22数据库技术版块每日发帖之星
日期:2016-08-02 06:20:00数据库技术版块每日发帖之星
日期:2016-04-24 06:20:00数据库技术版块每日发帖之星
日期:2016-04-13 06:20:00IT运维版块每日发帖之星
日期:2016-04-13 06:20:00数据库技术版块每日发帖之星
日期:2016-02-03 06:20:00数据库技术版块每日发帖之星
日期:2015-08-06 06:20:00季节之章:春
日期:2015-03-27 15:54:57羊年新春福章
日期:2015-03-27 15:54:37戌狗
日期:2015-03-19 16:56:41数据库技术版块每日发帖之星
日期:2016-08-18 06:20:00
6 [报告]
发表于 2012-04-20 14:46 |只看该作者
回复 5# D2002


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

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:15数据库技术版块每日发帖之星
日期:2015-11-26 06:20:00数据库技术版块每日发帖之星
日期:2016-02-25 06:20:00
7 [报告]
发表于 2012-04-20 14:57 |只看该作者
回复 6# liaosnet


    谢谢,以后有问题再请教

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:15数据库技术版块每日发帖之星
日期:2015-11-26 06:20:00数据库技术版块每日发帖之星
日期:2016-02-25 06:20:00
8 [报告]
发表于 2012-04-23 09:23 |只看该作者
本帖最后由 D2002 于 2012-04-23 14:40 编辑

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

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:15数据库技术版块每日发帖之星
日期:2015-11-26 06:20:00数据库技术版块每日发帖之星
日期:2016-02-25 06:20:00
9 [报告]
发表于 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程序那样就不检测,仅仅对应字符输出?




论坛徽章:
11
金牛座
日期:2015-03-19 16:56:22数据库技术版块每日发帖之星
日期:2016-08-02 06:20:00数据库技术版块每日发帖之星
日期:2016-04-24 06:20:00数据库技术版块每日发帖之星
日期:2016-04-13 06:20:00IT运维版块每日发帖之星
日期:2016-04-13 06:20:00数据库技术版块每日发帖之星
日期:2016-02-03 06:20:00数据库技术版块每日发帖之星
日期:2015-08-06 06:20:00季节之章:春
日期:2015-03-27 15:54:57羊年新春福章
日期:2015-03-27 15:54:37戌狗
日期:2015-03-19 16:56:41数据库技术版块每日发帖之星
日期:2016-08-18 06:20:00
10 [报告]
发表于 2012-04-23 18:40 |只看该作者
回复 9# D2002


    这个是半中文字符问题,似乎没什么好的办法。。自己控制好数据库里的值 吧。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP