知识大全 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

相关参考