Oracle Clob大小(字节)

Oracle Clob大小(字节),oracle,Oracle,我有一个具有以下NLS设置的数据库 NLS_NCHAR_CHARACTERSET - AL16UTF16 NLS_CHARACTERSET - AL32UTF8 有一个带有clob列的表,其中存储了base64编码的数据。 由于字符主要是英语和字母,我假设每个字符只占用1字节作为clob,使用NLS_CHARACTERSET的字符集进行编码 使用支持内联的clob列,clob将内联存储,除非其大小超过4096字节。然而,当我试图存储一组2048个字符的数据时,我发现它不是内联存储的(通过检

我有一个具有以下NLS设置的数据库

NLS_NCHAR_CHARACTERSET  - AL16UTF16

NLS_CHARACTERSET - AL32UTF8
有一个带有clob列的表,其中存储了base64编码的数据。 由于字符主要是英语和字母,我假设每个字符只占用1字节作为clob,使用NLS_CHARACTERSET的字符集进行编码

使用支持内联的clob列,clob将内联存储,除非其大小超过4096字节。然而,当我试图存储一组2048个字符的数据时,我发现它不是内联存储的(通过检查表DBA_TABLES)。那么这是否意味着每个字符不只是使用1个字节?有人能详细说明一下吗

另一项测试增加了: 使用块大小为8kb的clob列创建一个表,以便初始段大小为65536字节。 在clob列中插入一行32768个字符后。可以通过查询dba_段来判断第二个扩展数据块的创建。

它说:

CLOB列中的数据以与兼容的格式存储 当数据库字符集为多字节时,如UTF8或 AL32UTF8。这意味着一个英文版本所需的存储空间 转换数据时,文档将加倍


因此,看起来CLOB在内部将所有内容存储为UCS-2(Unicode),即每个符号固定2个字节。因此,它存储内联4096/2=2048个字符。

您的列真的是
CLOB
还是
NCLOB
?@SylvainLeroux它确实是CLOB。我甚至尝试创建一个新表,观察结果也是一样的。既然CLOB包含base64编码的数据,为什么base64不解码它并将字节存储在BLOB中呢?首先,由于CLOB存储为UCS-2(Rustys答案),您会将字节减半,然后您会将大小进一步减少25%吗?缺点是在查询时可能必须对其进行base64编码,因此可以选择使用更多空间(CLOB)或使用更多CPU(BLOB带解码/编码)。@KimBergHansen这是一个很好的建议。但我不能做任何与定义,因为它已经在生产中。我只是想评估一下磁盘的使用情况。我假设Oracle内部使用固定大小的编码来加速对任意位置字符的直接访问。可能吧?谢谢你的推荐!