2007年5月24日 星期四
其中一個有趣的問題,就是使用者要輸入趨於2000個漢字,漢字啊,據說utf8編碼一個漢字要3個字元,我說報的錯誤說我的字元數跟我輸入的漢字數怎麼也對不上關係呢,鬱悶了我老半天
用的是oracle資料庫
用普通的方法行不通
PreparedStatement pst = conn.prepareStatement("insert into table(name,book) values(?,?)");
pst.setString(1, "spring");
pst.setString(2,s);
pst.execute();
5606是oracle判斷的字元數
在網上查了以下,有高手說可能是oracle jdbc實現setString方法的原因
用字元流插入就行了
PreparedStatement pst = conn.prepareStatement("insert into table(name,book) values(?,?)");
pst.setString(1, "spring");
pst.setCharacterStream(2, new InputStreamReader(new ByteArrayInputStream(s.getBytes())), s.length());
pst.execute();
這樣可以正常插入。
高興...
可是好景不長,修改也用如此方法改之,記過又報錯: java.sql.SQLException: ORA-01483: DATE 或 NUMBER 賦值變數的長度無效
我暈,在我本地機子上tomcat環境下執行是沒有這種錯誤的,而部署到伺服器上,伺服器上是weblogic,就報這樣的錯誤,修改失敗,而 insert就沒有錯誤,而且如果修改字元數較小的就能修改成功,如果修改較大的就會報錯,之後不管修改什麼樣的,都會報錯,鬧鬼了,納悶了,這是什麼錯 誤啊,接著在網上查,高手建議
改成下面這樣子
int length=book.length();
String s1="";
String s2="";
if(length>1000){
s1=book.substring(0,1000);
s2=book.substring(1000,length);
}else{
s1=book;
}
pstmt = conn.prepareStatement("update table set book=?||? "+
"where name=?");
pstmt.setString(1, s1);
pstmt.setString(2, s2);
pstmt.setInt(3, “spring”);
結果就成功了,嘿嘿,原來還有這種方法,這是oracle特有的麼?呵呵對oracle不熟悉
而讓人納悶的是為什麼在我的tomact下就沒有這種錯誤呢,而insert的時候也沒有錯誤啊。納悶