DB2使用Java在AIX(存儲過程)和中文Windows編程中的中文問題
發表于:2007-07-14來源:作者:點擊數:
標簽:
DB2使用 Java 在AIX(存儲過程)和中文 Windows 編程中的中文問題 在db2的實際應用中,經常是 服務器 是AIX,客戶機是 WINDOWS 系統.而且常要用JAVA編寫存儲過程,這時就有漢字編碼的問題,因為存儲過程是在AIX內運行的,而輸入是中文WINDOW端,最后輸出到中文WINDOW
DB2使用
Java在AIX(存儲過程)和中文
Windows編程中的中文問題
在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:\project\java\untitled1\classes>java -version
java version "1.1.8"
G:\project\java\untitled1\classes>java t1
這是漢字
size=4
GBK
G:\project\java\untitled1\classes>
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的編碼類型進行聲明。
對于一般的應用,如果認為有可能有編碼的問題,按照以下規則來做就可以了
1 從數據庫中讀入正確的字符串,使用以下語句轉換進行明文聲明
stmp1=st.getString(1); //從數據庫讀入字符串
stmp1=new String(stmp1.getBytes("GBK")); //對stmp1的編碼明文說明為GBK編碼轉為本地字符串
2 對于信息寫入數據庫時,使用以下語句轉換
sql = new String(sql.getBytes(),"GBK");
stat.execute(sql);
對sql的本地編碼的字符串明文轉為GBK編碼的字符串
以上在平臺中文WINNT4.0,JBuilder4及Aix 4.0,DB2 7.1下測試完成
· 參考資料
標準版,API 規范的其他方面的信息。
· 關于作者
王輝,具有八年的編程及系統管理經驗,所使用的語言為C和Java 編程語言。目前在深圳一家公司做
程序員,使用C和JAVA為DB2數據庫編程.可通過 ddxxkk@21cn.com 聯系。
原文轉自:http://www.anti-gravitydesign.com