DB2在命令行下,从数据库中查出来的中文是乱码

来源:互联网 发布:淘宝上图片空间在哪里 编辑:程序博客网 时间:2024/04/29 05:24

【2011-05-20】

这是我在工作中遇到的。我的操作系统版本:Microsoft Windows XP [版本5.1.2600],DB2的版本:DB2 v9.7.200.358。

我在DB2CLP下,可以插入中文数据,也可以显示中文字符,但是从数据库中查数据时,中文的数据全部是乱码,我花了很长时间收集相关的资料,这一篇比较实用。主要解决办法在于修改db2codepage,如何修改是重点,下文便是详细的介绍。

 

中文乱码和代码页转换

执行命令db2 connect to sample后系统返回如下错误:

1.  SQL0332N There is no available conversion for the source code page "819" 

   to the target code page "1386". Reason Code "1". SQLSTATE=57017 

DB2要求源代码页与目标代码页是彼此兼容的。在上述例子中,源代码页为819,目标代码页为1386,两者并不兼容才导致了数据库连接失败。解决方法如下:

请在执行db2 connect命令失败的机器上,开启DB2命令窗口并执行以下命令后再重新进行连接:

db2set db2codepage=819

如何在Windows的命令编辑器中正确显示英文代码页数据库中的中文字符?

DB2中,对于要存放双字节字符的数据库来说,我们支持的方式是选择其相应的双字节字符集的代码页创建数据库。

但在有些情况下,由于用户的某些特殊需求,可能会选择创建单字节字符集码页的数据库来存放双字节字符的数据。这里以中文这一双字节字符集为例,在中文环境(如中文Windows操作系统)下,用户对一个用英文码页1252创建的数据库中存放的中文字符进行查询操作。

当查询在DB2命令行处理器中进行时,返回的结果能正确地显示中文字符,如:

1.  C:>db2 select * from test  

2.  A1  

3.  ----  

4.  我们  

5.  1条记录已选择。 

但当查询是在DB2图形界面的命令编辑器工具中进行的时候,为能够连接1252码页的数据库,启动该图形化工具的环境必须有DB2CODEPAGE=1252的注册变量设置,但因此所有命令的输出结果中的中文字符都将被显示为乱码,该查询返回的结果中的中文字符也不例外,如:

1.  C:>db2 select * from test  

2.  A1  

3.  ----  

4.  我们  

5.  1条记录已选择。 

我们可以看到输出结果中的中文字符是乱码:

1.  ----------------- 输入的命令 -------------------  

2.  connect to SBCSDB ;  

3.  -----------------------------------------------------

4.  connect to SBCSDB   

5.  ?????????????   

6.  ??????·????÷ = DB2/NT 8.2.1   

7.  SQL ???¨±ê? = LIWENLI   

8.  ±?????????±??? = SBCSDB   

9.  与目标的JDBC 连接已成功。  

10.-------------- 输入的命令 ------------------------------  

11.select * from test  

12.--------------------------------------------

13.单个查询的结果显示在"查询结果"选项卡上。  

14.成功地返回了行。 

出现上述情况下中文显示呈乱码的现象,主要是由于DB2的图形化工具是在有 DB2CODEPAGE=1252这种DB2单字节字符集注册变量设置的DB2命令窗口中启动所导致的。由于DB2图形工具是通过Java程序实现的,因此,在这样的环境下,Java初始化程序便会以单字节字符集方式启动DB2的图形化工具,从而出现上面描述的中文字符显示错误的问题。

为在DB2的命令编辑器中成功显示该1252码页数据库中的中文字符,可采用下述步骤:

(1) DB2命令窗口中,利用db2set DB2CODEPAGE=1386(中文码页)设置中文码页环境,然后使用命令db2ce启动DB2命令编辑器。

此时,在命令编辑器中输入连接数据库的命令,会遇到以下报错:

1.  ----------------- 输入的命令 ------------------------------  

2.  connect to SBCSDB ;  

3.  -----------------------------------------------------  

4.  connect to SBCSDB   

5.  SQL0332N 没有从源代码页 "1252" 至目标代码页 "1386"的转换。原因码是"1"  SQLSTATE=57017 

(2) 不要退出已启动的命令编辑器,在启动命令编辑器的DB2命令窗口中重新设置 DB2CODEPAGE注册变量为英文的1252码页:

1.  db2set DB2CODEPAGE=1252  

2.  db2 terminate 

(3) 再次尝试数据库的连接和查询操作,命令编辑器中返回的结果为:

1.  ------------------ 输入的命令 ------------------------------  

2.  connect to SBCSDB ;  

3.  ---------------------------------------------------  

4.  connect to SBCSDB   

5.  数据库连接信息  

6.  数据库服务器 = DB2/NT 9.5  

7.  SQL授权标识 = ORACLE  

8.  本地数据库别名 = SBCSDB  

9.  与目标的JDBC 连接已成功。  

10.------------ 输入的命令 ------------------------------  

11.select * from test;  

12.-------------------------------------------------------  

13.select * from test  

14.A1   

15.----  

16.我们  

17.1条记录已选择。 

可以看到,当使用1386中文码页启动了命令编辑器后,在不退出命令编辑器的情况下,通过重新设置DB2的注册变量DB2CODEPAGE1252英文码页的方法,既可实现英文码页数据库的连接,又可达到使各操作执行结果中的中文字符被正确显示的效果。

不过,由于使用单字节字符集码页创建的数据库来存放双字节字符的方式不为DB2 所正式支持,所以这里介绍的方法只能帮助用户在DB2命令编辑器中正确显示数据库中的双字节字符,但在其他Java应用中,这样的数据库仍然可能会遇到同样的问题,而且代码页在创建数据库时一旦选择,以后就无法更改代码页,所以我们还是强烈建议选择相应的双字节字符集的代码页来创建数据库。您也可以在建数据库时选择UTF(unicode)方式以避免这一类问题发生。

总之,所有的代码页问题级基本上都是由于当前运行环境代码页和数据库服务器数据库代码页不一致造成的。如果在两者一致的情况下数据显示不正常,那么通常和创建数据库时指定单字节(SBCS,欧美国家是单字节)和双字节(DBCS,东亚国家是双字节)有关。

 

原创粉丝点击