關于DB2使用JAVA在AIX(存儲過程)和中文WINDOWS編程中的中文問題

內容:

文件的和庫表中的信息

測試以下語句,可知在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的編碼類型進行聲明。

使用Netbeans IDE 5.0解決Java ME開發中的設備分裂問題
使用Netbeans IDE 5.0解決Java ME開發中的設備分裂問題
  設備分裂問題給java ME應用程序開發帶來了不小的麻煩,在不同設備之間移植應用程序通常會碰到各種各樣的問題。本文介紹如何使用Netbeans IDE 5.0提供的預處理代碼功能解決設備分裂問題。盡管Java ME平台的發展是...查看完整版>>使用Netbeans IDE 5.0解決Java ME開發中的設備分裂問題
 
深入剖析Java編程中的中文問題及建議最優解決方法---下篇
深入剖析Java編程中的中文問題及建議最優解決方法--下篇 4、中文問題的分類及其建議最優解決辦法 了解以上JAVA處理文件的原理之後,我們就可以提出了一套建議最優的解決漢字問題的辦法。 我們的目標是:我們...查看完整版>>深入剖析Java編程中的中文問題及建議最優解決方法---下篇
 
深入剖析Java編程中的中文問題及建議最優解決方法--上篇
深入剖析Java編程中的中文問題及建議最優解決方法--上篇說明:本文爲作者原創,作者聯系地址爲:josserchai@yahoo.com。由于Java編程中的中文問題是一個老生常談的問題,在閱讀了許多關于Java中文問題解決方法之後,...查看完整版>>深入剖析Java編程中的中文問題及建議最優解決方法--上篇
 
AIX環境下DB2許可證問題的解決方法及步驟
內容提要:本文旨在爲用戶提供一個在 AIX 操作系統下解決有關 DB2許可證文件的步驟。 說明:在 DB2 UDB 産品的安裝和使用過程中,有時用戶會遇到與 DB2 許可證相關的問題。(例如:SQL8008N,報有關 DB2 産品沒有安裝...查看完整版>>AIX環境下DB2許可證問題的解決方法及步驟
 
C#中使用存儲過程中的返回值
對于高手這個問題可能很簡單(可不要扔西紅柿啊!!),可對于新手可能真會苯住一會,我拿出來積累一下,也供大家參考: string sql = "DECLARE @para0 char(40) "; sql += "exec 存儲過程名稱,p...查看完整版>>C#中使用存儲過程中的返回值
 
關于PB和存儲過程的問題
關于PB和存儲過程的問題 關于PB和存儲過程的問題 存儲過程實爲一個解決很多的問題的好辦法,以經有近一個星期的時間了,被卡在存儲過程的問題上了,存儲過程在後台執行一切正常,功能爲傳遞兩個視圖名和視圖...查看完整版>>關于PB和存儲過程的問題
 
關于PB和存儲過程的問題
存儲過程實爲一個解決很多的問題的好辦法,以經有近一個星期的時間了,被卡在存儲過程的問題上了,存儲過程在後台執行一切正常,功能爲傳遞兩個視圖名和視圖中的字段名,在存儲過程中創建一個表,形成交叉報表的型式...查看完整版>>關于PB和存儲過程的問題
 
關于2.0 中的用戶控件編程使用
今天用了一下2.0中的用戶控件,發現使用編程方式使用用戶控件,跟1.X 中截然不同。1、首先,要在所要使用的Page 頭部聲明引用。如下:<%@ Reference Control="../Controls/AlbumEditor.ascx" %>2、在後置代碼裏...查看完整版>>關于2.0 中的用戶控件編程使用
 
考慮大對象:利用 JAVA 操作 DB2 Universal Database 中的 LOB 數據
考慮大對象:利用 JAVA 操作 DB2 Universal Database 中的 LOB 數據 考慮大對象:利用 JAVA 操作 DB2 Universal Database 中的 LOB 數據 諸如圖像和音頻這樣的大型數據對象經常需要存儲在數據庫中。DB2 Univ...查看完整版>>考慮大對象:利用 JAVA 操作 DB2 Universal Database 中的 LOB 數據
 
 
回到王朝網路移動版首頁