內容:
文件的和庫表中的信息
測試以下語句,可知在AIX和中文系統下的編碼是不同的
對於測試以下語句 AIX=AIX系統+DB2(GBK) 中文windows=中文NT+DB2(GBK)
對於輸入的信息,再加入數據庫
小結
參考資料
作者簡介
在db2的實際應用中,經常是服務器是AIX,客戶機是WINDOWS系統.而且常要用Java編寫存儲過程,這時就有漢字編碼的問題,因為存儲過程是在AIX內運行的,而輸入是中文WINDOW端,最後輸出到中文WINDOWS.
以下的問題是我在工作中碰到的幾個問題的解決方法:
1 文件的和庫表中的信息
本問題是在編寫存儲過程中碰到的,假如不是存儲過程,而是客戶機的JAVA程序是在中文WINDOWS上編譯運行與是沒有問題的。
(1) 從表中讀信息寫入文件中--系統AIX 代碼頁8859_1,DB2代碼頁GBK
String stmp1=st.getString("username");
stmp1=new String(stmp1.getBytes("GBK"));
OutputStreamWriter outf=new OutputStreamWriter(new java.io.FileOutputStream(sfilename));
outf.write(stmp+""+s0d0a);
outf.close();
stmp1從表中getString("username");讀出後再用
stmp1=new String(stmp1.getBytes("GBK"));
進行轉換否則中文是亂碼
(2) 從文件讀信息寫入數據庫中--系統AIX 代碼頁8859_1,DB2代碼頁GBK java.io.BufferedReader intf=new BufferedReader(new InputStreamReader(new java.io.FileInputStream(sfilename)));
String stmp= intf.readLine();
byte[] BTmp= stmp.getBytes();
String sinfo=new String(btmp, 1,10);
String sql="insert into test1(name,info) values(′"+sinfo+"′,′"+stmp+"′)";
sql = new String(sql.getBytes(),"GBK");
stat.executeUpdate(sql);
其中一定用sql = new String(sql.getBytes(),"GBK");
而用 sql = new String(sql.getBytes("GBK")); 是不對的.因為本地的代碼頁是8859_1
2 測試以下語句,可知在AIX和中文系統下的編碼是不同的
String ss="這是漢字";
System.out.println(ss);
System.out.println("size="+ss.length());
System.out.println(System.getProperty("file.encoding"));
在AIX出現
$ java -version
java version "1.1.8"
$ java t1
這是漢字
size=8
ISO8859_1
$
在NT系統上
G:projectjavauntitled1classes>java -version
java version "1.1.8"
G:projectjavauntitled1classes>java t1
這是漢字
size=4
GBK
G:projectjavauntitled1classes>
3 對於測試以下語句 AIX=AIX系統+DB2(GBK) 中文windows=中文NT+DB2(GBK)
ResultSet st=stat.executeQuery("select name from test1");
while (st.next())
{
System.out.println(st.getString(1));
}
對於中文WINDOWS系統可以正常,對於AIX就是?了.加入轉換後為以下語句(註重:ss=new String(ss.getBytes(),"8859_1")是不可以的) ,結果是AIX正常而在中文windows下變成了?
ResultSet st=stat.executeQuery("select name from test1");
while (st.next())
{
ss=st.getString(1);
ss=new String(ss.getBytes("GBK"));
System.out.println(ss);
}
最後的改進 String scode=System.getProperty("file.encoding").trim();
ResultSet st=stat.executeQuery("select name from test1");
while (st.next())
{
ss=st.getString(1);
if (scode.equals("ISO8859_1")) ss=new String(ss.getBytes("GBK"));
System.out.println(ss);
}
4 對於輸入的信息,再加入數據庫
public static void main(String[] args) {
String tt="";
if (args.length==1) tt=args[0];
else {
..................
}
Connection conn= DriverManager.getConnection("jdbc:db2:OFTMS_TM","db2inst1","ibmdb2");
Statement stat=conn.createStatement();
String sql="insert into test1(name) values (′"+tt+"′)";
//假如在中文windows上可不用下行
sql=new String(sql.getBytes(),"GBK");
stat.execute(sql);
System.out.println(sql);
無論對於AIX還是中文windows全部是可以正常把信息加入表中
小結
根據以上的情況總結,可知在對於在DB2中用JAVA編寫存儲過程時,假如不能確定服務器和DB2所用語言的一致性,那麽就要明文對String的編碼類型進行聲明。