字元集合決定varchar2的長度–Oracle定義varchar2()類型儲存漢字的長度問題

來源:互聯網
上載者:User

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");

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.