问题描述
先生,
我想知道我什么时候可以使用NClob并且不能使用Clob?数据库的字符现在是US7ASCII。我测试使用了一些中文和日文字符。看起来我可以找回我在Clob列中插入的内容,但是对于NClob列,我看到一些问号。
同样使用JDBC,为什么Clob和NClob的length方法似乎都返回字节而不是字符数?我也不明白我插入的东西。(请参阅一些不可读的字符)。
输出为:
谢谢,
小何
我想知道我什么时候可以使用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设置为US7ASCII的客户端,那么我将获得所有三个结果的 “a”,即,我将失去所有重音等。同样,如果我将它们存储在US7ASCII数据库中,它们仍然可能存储得很好,甚至可能显示得很好,但这是 “好运” 比其他任何东西都重要-我们依靠一些位来对齐。如果您需要设置多字节字符的样式,那么您希望整个数据库是一个多字节字符集 (如UTF8),或者您将使用N-datatype列 (nvarchar2,nclob)。
例如,您给出的示例在两种情况下都适用于 * 多字节 * 数据库 (例如,这是我的UTF8数据库)

对于Java,请查看MOS note 2190241.1。它有一系列关于为nclob指定/插入/更新字符的示例。
例如,考虑以下8位字符 (存储在我的数据库中,即WE8MSWIN1252,即8位字符集)。
如果我将它们选择回NLS设置为US7ASCII的客户端,那么我将获得所有三个结果的 “a”,即,我将失去所有重音等。同样,如果我将它们存储在US7ASCII数据库中,它们仍然可能存储得很好,甚至可能显示得很好,但这是 “好运” 比其他任何东西都重要-我们依靠一些位来对齐。如果您需要设置多字节字符的样式,那么您希望整个数据库是一个多字节字符集 (如UTF8),或者您将使用N-datatype列 (nvarchar2,nclob)。
例如,您给出的示例在两种情况下都适用于 * 多字节 * 数据库 (例如,这是我的UTF8数据库)
对于Java,请查看MOS note 2190241.1。它有一系列关于为nclob指定/插入/更新字符的示例。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
Oracle RAC 一键安装翻车?手把手教你如何排错!
Lucifer三思而后行
597次阅读
2025-04-15 17:24:06
【纯干货】Oracle 19C RU 19.27 发布,如何快速升级和安装?
Lucifer三思而后行
570次阅读
2025-04-18 14:18:38
XTTS跨版本迁移升级方案(11g to 19c RAC for Linux)
zwtian
488次阅读
2025-04-08 09:12:48
Oracle数据库一键巡检并生成HTML结果,免费脚本速来下载!
陈举超
474次阅读
2025-04-20 10:07:02
【ORACLE】记录一些ORACLE的merge into语句的BUG
DarkAthena
458次阅读
2025-04-22 00:20:37
Oracle 19c RAC更换IP实战,运维必看!
szrsu
434次阅读
2025-04-08 23:57:08
【ORACLE】你以为的真的是你以为的么?--ORA-38104: Columns referenced in the ON Clause cannot be updated
DarkAthena
433次阅读
2025-04-22 00:13:51
【活动】分享你的压箱底干货文档,三篇解锁进阶奖励!
墨天轮编辑部
419次阅读
2025-04-17 17:02:24
火焰图--分析复杂SQL执行计划的利器
听见风的声音
363次阅读
2025-04-17 09:30:30
3月“墨力原创作者计划”获奖名单公布
墨天轮编辑部
358次阅读
2025-04-15 14:48:05