暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle Clob和NClob

askTom 2017-02-23
912

问题描述

先生,

我想知道我什么时候可以使用NClob并且不能使用Clob?数据库的字符现在是US7ASCII。我测试使用了一些中文和日文字符。看起来我可以找回我在Clob列中插入的内容,但是对于NClob列,我看到一些问号。

SQL> create table test(a clob, b nclob);
SQL> insert into test values (to_clob('你あ'), to_nclob('你あ'));
SQL> col a for a10
SQL> col b for a10
SQL> select * from test;

A    B
---------- ----------
你あ    ??????

SQL> select parameter, value from v$nls_parameters where parameter like '%CHARACTERSET%';

PARAMETER                   VALUE
--------------------------- --------------------
NLS_CHARACTERSET            US7ASCII
NLS_NCHAR_CHARACTERSET      UTF8
复制


同样使用JDBC,为什么Clob和NClob的length方法似乎都返回字节而不是字符数?我也不明白我插入的东西。(请参阅一些不可读的字符)。

public static void main(String[] args) {
    try {
      Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1522/pdb1", "restdev", "restdev");
      Statement stmt = conn.createStatement();
      stmt.execute("insert into test values (to_clob('你あ'), to_nclob('你あ'))");
      ResultSet rs = stmt.executeQuery("select * from test");
      rs.next();
      Clob c = rs.getClob(1);
      NClob nc = rs.getNClob(2);
      System.out.println(c.length());
      System.out.println(nc.length());
      System.out.println(c.getSubString(1, 10));
      System.out.println(nc.getSubString(1, 10));
      stmt.close();
    } catch (SQLException e) {
      e.printStackTrace();
    }
  }
复制


输出为:
6
6
¦ᄑᅠ ̄チツ
������
复制


谢谢,
小何

专家解答

在处理 “有损” 字符集时,你需要非常小心,即那些不能容纳你需要的所有信息的字符集。仅仅因为我们存储数据并不意味着以后会正确表示它。

例如,考虑以下8位字符 (存储在我的数据库中,即WE8MSWIN1252,即8位字符集)。

NLS_CHARS

如果我将它们选择回NLS设置为US7ASCII的客户端,那么我将获得所有三个结果的 “a”,即,我将失去所有重音等。同样,如果我将它们存储在US7ASCII数据库中,它们仍然可能存储得很好,甚至可能显示得很好,但这是 “好运” 比其他任何东西都重要-我们依靠一些位来对齐。如果您需要设置多字节字符的样式,那么您希望整个数据库是一个多字节字符集 (如UTF8),或者您将使用N-datatype列 (nvarchar2,nclob)。

例如,您给出的示例在两种情况下都适用于 * 多字节 * 数据库 (例如,这是我的UTF8数据库)

NLS_CHARS2

对于Java,请查看MOS note 2190241.1。它有一系列关于为nclob指定/插入/更新字符的示例。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论