2017-02-21 76 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中的默认值)创建的数据库用作编码。