知识大全 Oracle基本数据类型存储格式浅析(一)-字符类型
Posted 类型
篇首语:研卷知古今;藏书教子孙。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Oracle基本数据类型存储格式浅析(一)-字符类型相关的知识,希望对你有一定的参考价值。
Oracle基本数据类型存储格式浅析(一)-字符类型 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
前一阵看完文档 对oracle的基本数据类型的存储格式有了一些了解 最近有做了一些测试进行了验证
打算整理总结一下 这一篇主要说明字符类型的存储格式 主要包括char varchar 和long等几种类型
SQL> create table test_char (char_col char( ) varchar_col varchar ( ) long_col long);
表已创建
SQL> insert into test_char values ( abc fd );
已创建 行
SQL> mit;
提交完成
SQL> select rowid from test_char;
ROWID AAAB LAAFAAAAAgAAA
根据rowid的定义规则 第 ~ 位是表示的是数据文件 F表示 而 ~ 位表示的是在这个数据文件中的第几个BLOCK g表示 (rowid编码相当于 进制 用A~Z a~z ~ + /共 个字符表示 A表示 B表示 …… a表示 …… 表示 …… +表示 /表示 )
我们根据计算的结果去dump这个block
SQL> ALTER SYSTEM DUMP DATAFILE BLOCK ;
系统已更改
打开产生的trace文件
data_block_dump data header at x ===============tsiz: x f hsiz: x pbl: x bdba: x flag= ntab= nrow= frre= fsbo= x fseo= x f avsp= x f etosp= x f e xe:pti[ ] nrow= offs= x :pri[ ] offs= x f block_row_dump:tab row @ x f tl: fb: H FL lb: x cc: col : [ ] col : [ ] col : [ ] c end_of_block_dumpEnd dump data blocks tsn: file#: minblk maxblk
观察dump出来的结果 可以发现以下几点
对于每个字段 除了保存字段的值以外 还会保存当前字段中数据的长度 而且 oracle显然没有把字段的长度定义或类型定义保存在block中 这些信息保存在oracle的数据字典里面
根据dump的结果 可以清楚的看到 字符类型在数据库中是以ascii格式存储的
SQL> select chr(to_number( xx )) from dual;
CH a
char类型为定长格式 存储的时候会在字符串后面填补空格 而varchar 和long类型都是变长的
SQL> SELECT DUMP(CHAR_COL ) D_CHAR FROM TEST_CHAR;
D_CHAR Typ= Len= :
SQL> SELECT DUMP(VARCHAR_COL ) D_VARCHAR FROM TEST_CHAR;
D_VARCHAR Typ= Len= :
SQL> SELECT DUMP(LONG_COL ) D_VARCHAR FROM TEST_CHAR;SELECT DUMP(LONG_COL ) D_VARCHAR FROM TEST_CHAR *ERROR 位于第 行:ORA : 非法使用 LONG 数据类型
由于DUMP不支持LONG类型 因此我们使用了alter system dump block的方式 通过比较两种方式得到的结果 发现DUMP()函数不但方便 结果清晰 而且指出了进行DUMP的数据类型 在以后的例子中 除非必要的情况 否则都会采用DUMP()函数的方式进行说明
下面看一下插入中文的情况 首先看一下数据库的字符集
SQL> select name value$ from sys props$ where name like %CHARACTERSET% ;
NAME VALUE$ NLS_CHARACTERSET ZHS GBKNLS_NCHAR_CHARACTERSET AL UTF
SQL> insert into test_char values ( 定长 变长 null);
已创建 行
SQL> SELECT DUMP(CHAR_COL ) D_CHAR FROM TEST_CHAR;
D_CHAR Typ= Len= : Typ= Len= : b a b a
SQL> SELECT DUMP(VARCHAR_COL ) D_VARCHAR FROM TEST_CHAR;
D_VARCHAR Typ= Len= : Typ= Len= : b e b a
根据dump结果 可以清楚的看出 普通英文字符和标点用一个字节表示 而中文字符或中文标点需要两个字节来表示
下面 对比一下nchar和nvarchar 与char varchar 类型有什么不同
SQL> create table test_nchar (nchar_col nchar( ) nvarchar_col nvarchar ( ));
表已创建
SQL> insert into test_nchar values ( nchar定长 nvarchar变长 );
已创建 行
从这里已经可以看出一些不同了 如果按照刚才中文的计算方法 nvarchar变长 的长度是 + * = 已经超过了数据类型定义的大小 可是为什么插入成功了?
还是dump一下看看结果吧
SQL> select dump(nchar_col ) from test_nchar;
DUMP(NCHAR_COL ) Typ= Len= : e b a f
SQL> select dump(nvarchar_col ) from test_nchar;
DUMP(NVARCHAR_COL ) Typ= Len= : e d f
cha138/Article/program/Oracle/201311/18368相关参考