2007年5月24日 星期四
其中一個有趣的問題,就是用戶要輸入趨于2000個漢字,漢字啊,據(jù)說utf8編碼一個漢字要3個字符,我說報的錯誤說我的字符數(shù)跟我輸入的漢字?jǐn)?shù)怎么也對不上關(guān)系呢,郁悶了我老半天
用的是oracle數(shù)據(jù)庫
用普通的方法行不通
PreparedStatement pst = conn.prepareStatement("insert into table(name,book) values(?,?)");
pst.setString(1, "spring");
pst.setString(2,s);
pst.execute();
5606是oracle判斷的字符數(shù)
在網(wǎng)上查了以下,有高手說可能是oracle jdbc實現(xiàn)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環(huán)境下運行是沒有這種錯誤的,而部署到服務(wù)器上,服務(wù)器上是weblogic,就報這樣的錯誤,修改失敗,而 insert就沒有錯誤,而且如果修改字符數(shù)較小的就能修改成功,如果修改較大的就會報錯,之后不管修改什么樣的,都會報錯,鬧鬼了,納悶了,這是什么錯 誤啊,接著在網(wǎng)上查,高手建議把一個字符拆成兩個代入
改成下面這樣子
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”);
結(jié)果就成功了,嘿嘿,原來還有這種方法,這是oracle特有的么?呵呵對oracle不熟悉
而讓人納悶的是為什么在我的tomact下就沒有這種錯誤呢,而insert的時候也沒有錯誤啊。納悶