oracle 的varchar2(4000)通過jdbc的thin驅動串連為什麼只可以存666個漢字?
誰說只能儲存666個漢字的?
varchar2最大是4000位元組,那麼就看你的oracle字元集,如果字元集是16位編碼的,ZHS16GBK,那麼每個字元16位,2位元組,所以可以容納2000字元。
如果是32位編碼的字元集,那麼只能儲存 1000個字元。
select length('我們'), lengthb('我們') from dual;
字元集合決定varchar2的長度
問題描述:
intert into T_BOARD values('超過17個漢字');
報錯:插入字元過長!發現一個漢字佔3個位元組,所以報錯!!!
問題所在:
使用的字元集是UTF8,就有可能出現這個錯誤!
使用命令查看:
SQL> select parameter,value from nls_database_parameters where parameter like 'NLS_CHARACTERSET';
PARAMETER
------------------------------------------------------------
VALUE
--------------------------------------------------------------------------------
NLS_CHARACTERSET
AL32UTF8
解決方案:
建議使用ZHS16GBK字元集!
操作:
SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP MOUNT;
SQL> ALTER SYSTEM ENABLE RESTRICTED SESSION;
SQL> ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
SQL> ALTER DATABASE OPEN;
SQL> ALTER DATABASE CHARACTER SET AL32UTF8/ZHS16GBK;
SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP;
問題解決!!! (改變時注意新的字元集是舊的超集問題)
附註1:
Re: 研究:為什麼我的ORACLE的資料操作突然報數量限制的錯誤(怪)?
|
發表時間: 2003-12-05 09:25 |
|
這是很經典的OracleJDBC問題。一般直接用ps.setString()設定字串資料時,Oracle的JDBC驅動會將中文轉換為2位元組或3位元組,不固定的,因此經常會越界。 如果你改為ps.setCharacterStream()就是固定的每個中文兩個位元組
|
根據oracle的文檔,thin的jdbc驅動,會根據字元集合決定varchar2的長度,如果不是ascii
或者拉丁字元集合,長度的限制就是2000,因為它認為其他字元集都需要兩個位元組來儲存,但是通過jdbc的setString方法時候,驅動會把
java的utf-16轉換為utf-8,這樣英文由兩個位元組變成一個位元組,中文由兩個位元組變為3個位元組,所以2000/3大概就是666個中文字元了。
附註2:
在做更新操作時,辦法:
pstmt.setBytes(4,aimString.getBytes());取資料時:
new String(resultSet.getBytes("fieldName"),"ISO-8859-1");