2017-02-21 75 views
0

java.sql.Clobjava.sql.NClob之間是否有區別? java.sql.NClob接口沒有新的方法。我試過如下:JDBC Clob和NClob

的設置SQL:

create table tab(id number(2), clobcol clob, nclobcol nclob) 
insert into tab values (1, to_clob('你好'), to_nclob('你好')) 

JDBC代碼:

conn = getConnection(); 
stmt = conn.createStatement(); 
rs = stmt.executeQuery("select * from tab"); 
rs.next(); 
Clob c = rs.getClob(2); 
NClob nc = rs.getNClob(3); 
InputStream inputStream1 = c.getAsciiStream(); 
InputStream inputStream2 = nc.getAsciiStream(); 
System.out.println(inputStream1.available()); 
System.out.println(inputStream2.available()); 
c.free(); 
nc.free(); 

我也嘗試了一些其他的方法,貌似沒有從輸出差異。有沒有具體的我可以看到一些差異?

增加了支持的字符在數據庫中設置:

SELECT parameter, value 
    FROM v$nls_parameters 
    3 WHERE parameter LIKE '%CHARACTERSET'; 

PARAMETER    VALUE 
--------------------------------- -------------------- 
NLS_CHARACTERSET   AL32UTF8 
NLS_NCHAR_CHARACTERSET  AL16UTF16 
+0

NCLOBs列使用數據庫的國家字符集,而CLOB使用數據庫的字符集。如果您有特殊類型的數據不受數據庫默認字符集支持,那麼您可以創建N(CLOB,VARCHAR2等)列來存儲數據。 http://stackoverflow.com/questions/6854609/what-is-the-difference-between-clob-and-nclob – JSapkota

+0

是的,我在發佈這個問題之前閱讀了該線程。我不能拿出一個例子來看看區別。 – user2018791

+0

如果兩個字符集都能夠存儲您輸入的字符,則沒有區別。如果我沒有弄錯,那麼在UTF-16中只能使用UTF-8表示的字符很少,不能用UTF-8表示。如果'NLS_CHARACTERSET'是單字節字符集,則會有區別。 –

回答

0

在許多數據庫中使用US7ASCII(在美國)或ISOLATIN1作爲字符集創建(在歐洲)舊時代(80年代)。對於今天仍然存在的這些數據庫(在許多升級之後),存儲非ASCII字符字符串數據的唯一方法是使用特殊類型NVARCHAR或NCLOB。這些Nxxx類型不被新直接使用UTF8(現在是Oracle中的默認值)創建的數據庫用作編碼。