IT貓撲網(wǎng):您身邊最放心的安全下載站! 最新更新|軟件分類|軟件專題|手機(jī)版|論壇轉(zhuǎn)貼|軟件發(fā)布

您當(dāng)前所在位置: 首頁數(shù)據(jù)庫Oracle → Oracle數(shù)據(jù)類型及存儲(chǔ)方式

Oracle數(shù)據(jù)類型及存儲(chǔ)方式

時(shí)間:2015-06-28 00:00:00 來源:IT貓撲網(wǎng) 作者:網(wǎng)管聯(lián)盟 我要評論(1)

  概述

  通過實(shí)例,全面而深入的分析oralce的基本數(shù)據(jù)類型及它們的存儲(chǔ)方式。以ORACLE 10G為基礎(chǔ),介紹oralce 10g引入的新的數(shù)據(jù)類型。讓你對oracle數(shù)據(jù)類型有一個(gè)全新的認(rèn)識。揭示一些不為人知的秘密和被忽略的盲點(diǎn)。從實(shí)用和優(yōu)化的角度出發(fā),討論每種數(shù)據(jù)類型的特點(diǎn)。從這里開始o(jì)racle之旅!

  第一部份 字符類型

  §1.1 char

  定長字符串,會(huì)用空格來填充來達(dá)到其最大長度,最長2000個(gè)字節(jié)。

  1. 新建一個(gè)測試表test_char.,只有一個(gè)char類型的列。長度為10

  SQL> create table test_char(colA char(10));

  Table created

  2. 向這個(gè)表中插入一些數(shù)據(jù)。

  SQL> insert into test_char values('a');

  1 row inserted

  SQL> insert into test_char values('aa');

  1 row inserted

  SQL> insert into test_char values('aaa');

  1 row inserted

  SQL> insert into test_char values('aaaa');

  1 row inserted

  SQL> insert into test_char values('aaaaaaaaaa');

  1 row inserted

  注意:最多只能插入10個(gè)字節(jié)。否是就報(bào)錯(cuò)。

  SQL> insert into test_char values('aaaaaaaaaaa');

  insert into test_char values('aaaaaaaaaaa')

  ORA-12899: value too large for column "PUB_TEST"."TEST_CHAR"."COLA" (actual: 11, maximum: 10)

  3. 使用dump函數(shù)可以查看每一行的內(nèi)部存數(shù)結(jié)構(gòu)。

  SQL> select colA, dump(colA) from test_char;

  COLA DUMP(COLA)

  ---------- --------------------------------------------------------------------------------

  a??? Typ=96 Len=10: 97,32,32,32,32,32,32,32,32,32

  aa?? Typ=96 Len=10: 97,97,32,32,32,32,32,32,32,32

  aaa? Typ=96 Len=10: 97,97,97,32,32,32,32,32,32,32

  aaaa Typ=96 Len=10: 97,97,97,97,32,32,32,32,32,32

  aaaaaaaaaa Typ=96 Len=10: 97,97,97,97,97,97,97,97,97,97

  注意:Typ=96 表示數(shù)據(jù)類型的ID。Oracle為每一種數(shù)據(jù)類型都進(jìn)行了編號。說明char類型的編號是96.

  Len =10 表示所在的內(nèi)部存儲(chǔ)的長度(用字節(jié)表示)。雖然第一例只存了一個(gè)字符’a’,但是它還是占用了10個(gè)字節(jié)的空間。

  97,32,32,32,32,32,32,32,32,32 表示內(nèi)部存儲(chǔ)方式??梢妎racle的內(nèi)部存儲(chǔ)是以數(shù)據(jù)庫字符集進(jìn)行存儲(chǔ)的。

  97正好是字符a的ASCII碼。

  可以使用chr函數(shù)把ASCII碼轉(zhuǎn)成字符。

  SQL> select chr(97) from dual;

  CHR(97)

  -------

  a

  要想知道一個(gè)字符的ASCII碼,可以使用函數(shù)ascii

  SQL> select ascii('a') from dual;

  ASCII('A')

  ----------

  97

  32正好是空格的ascii碼值。

  Char類型是定長類型。它總會(huì)以空格來填充以達(dá)到一個(gè)固定寬度。

  使用char類型會(huì)浪費(fèi)存儲(chǔ)空間。

  Oracle的數(shù)據(jù)類型的長度單位是字節(jié)。

  SQL> select dump('漢') from dual;

  DUMP('漢')

  ---------------------

  Typ=96 Len=2: 186,186

  可見一個(gè)漢字在oracle中是占用了兩個(gè)字節(jié)的。

  英文字母或符號只占用一個(gè)字節(jié)。

  Char(10)最多可存放5個(gè)漢字。

  §1.2 varchar2

  是一種變長的字符類型。最多可占用4000字節(jié)的存儲(chǔ)空間。

  1. 創(chuàng)建一個(gè)表,只有一列,類型為varchar2,長度為10

  SQL> create table test_varchar( col varchar2(10));

  Table created

  2. 插入一些數(shù)據(jù)

  SQL> insert into test_varchar values('a');

  1 row inserted

  SQL> insert into test_varchar values('aa');

  1 row inserted

  SQL> insert into test_varchar values('aaa');

  1 row inserted

  SQL> insert into test_varchar values('aaaaaaaaaa');

  1 row inserted

  SQL> insert into test_varchar values('aaaaaaaaaaa');

  2. 用dump函數(shù)查看每一行的內(nèi)部存儲(chǔ)結(jié)構(gòu)。

  SQL> select col, dump(col) from test_varchar;

  COL? DUMP(COL)

  ---------- --------------------------------------------------------------------------------

  a??? Typ=1 Len=1: 97

  aa?? Typ=1 Len=2: 97,97

  aaa? Typ=1 Len=3: 97,97,97

  aaaaaaaaaa Typ=1 Len=10: 97,97,97,97,97,97,97,97,97,97

  Typ=1,說明varchar2類型在oracle中的類型編號為1

  Len代表了每一行數(shù)據(jù)所占用的字節(jié)數(shù)。

  后面是具體的存儲(chǔ)值。

  由此可見,varchar2是存多少就占用多少空間。比較節(jié)省空間的。不會(huì)像char那樣用空格填充。

  §1.3 byte 和char

  在10g中,字符類型的寬度定義時(shí),可以指定單位。

  Byte就是字節(jié)。

  Char就是字符。

  Varchar2(10 byte) 長度為10個(gè)字節(jié)。

  Varchar2(10 char) 長度為10個(gè)字符所占的長度。

  Char(10 byte)長度為10個(gè)字節(jié)。

  Char(10 char) 長度為10個(gè)字符所占的長度。

  一個(gè)字符占用多少個(gè)字節(jié),是由當(dāng)前系統(tǒng)采用的字符集來決定的。

#p#副標(biāo)題#e#

  如一個(gè)漢字占用兩個(gè)字節(jié)。

  查看當(dāng)前系統(tǒng)采用的字符集

  SQL> select * from nls_database_parameters where parameter ='NLS_CHARACTERSET';

  PARAMETER??? VALUE

  ------------------------------ --------------------------------------------------------------------------------

  NLS_CHARACTERSET?? ZHS16GBK

  如果在定義類型時(shí),不指定單位。默認(rèn)是按byte,即以字節(jié)為單位的。

  采用char為單位的好處是,使用多字節(jié)的字符集。

  比如,在ZHS16GBK字符集中,一個(gè)漢字占用兩個(gè)字節(jié)。

  把數(shù)據(jù)表的某一列長度定義為可存放10個(gè)漢字,通過下面的定義就可以了。

  Create table test_varchar(col_char varchar2(10 char));

  這樣相對簡單一些。在數(shù)據(jù)庫表設(shè)計(jì)時(shí)需要注意。

  繼續(xù)實(shí)驗(yàn),新建一個(gè)表,包含兩列。一列采用byte為單位,一列采用char為單位

  SQL> create table test_varchar2 (col_char varchar2(10 char),col_byte varchar2(10 byte));

  Table created

  Col_char列,定義為可存放10個(gè)字符。

  Col_byte 列,定義為可存放10個(gè)字節(jié)的字符。

  當(dāng)前的系統(tǒng)采用字符集為ZHS16GBK.所以一個(gè)字符占兩個(gè)字節(jié)。

  試著在表中插入一些數(shù)據(jù)

  SQL> insert into test_varchar2 values('a','a');

  1 row inserted

  SQL> insert into test_varchar2 values('袁','a');

  1 row inserted

  SQL> insert into test_varchar2 values('袁袁袁袁袁袁袁袁袁袁','aaaaaaaaaa');

  1 row inserted

  SQL> insert into test_varchar2 values('袁袁袁袁袁袁袁袁袁袁','袁袁袁袁袁袁袁袁袁袁');

  insert into test_varchar2 values('袁袁袁袁袁袁袁袁袁袁','袁袁袁袁袁袁袁袁袁袁')

  ORA-12899: value too large for column "PUB_TEST"."TEST_VARCHAR2"."COL_BYTE" (actual: 20, maximum: 10)

  第一次, 在兩列中都插入字符a

  第二次, 在col_char列插入字符’袁’,在col_byte插入字符a

  第三次, 在col_char列中插入10個(gè)中文字符’袁’,在col_byte插入10個(gè)字符a

  第四次, 在兩列中都插入中文字符’袁’時(shí),報(bào)錯(cuò)了。第二列長度不夠。

  再看看每一行的存儲(chǔ)結(jié)構(gòu)

  SQL> select col_char, dump(col_char) from test_varchar2;

  COL_CHAR DUMP(COL_CHAR)

  -------------------- --------------------------------------------------------------------------------

  a???

關(guān)鍵詞標(biāo)簽:Oracle,數(shù)據(jù)類型,存儲(chǔ)

相關(guān)閱讀

文章評論
發(fā)表評論

熱門文章 Oracle中使用alter table來增加,刪除,修改列的語法 Oracle中使用alter table來增加,刪除,修改列的語法 oracle中使用SQL語句修改字段類型-oracle修改SQL語句案例 oracle中使用SQL語句修改字段類型-oracle修改SQL語句案例 誤刪Oracle數(shù)據(jù)庫實(shí)例的控制文件 誤刪Oracle數(shù)據(jù)庫實(shí)例的控制文件 為UNIX服務(wù)器設(shè)置Oracle全文檢索 為UNIX服務(wù)器設(shè)置Oracle全文檢索

相關(guān)下載

    人氣排行 oracle中使用SQL語句修改字段類型-oracle修改SQL語句案例 Oracle中使用alter table來增加,刪除,修改列的語法 ORACLE SQL 判斷字符串是否為數(shù)字的語句 ORACLE和SQL語法區(qū)別歸納(1) oracle grant 授權(quán)語句 ORACLE修改IP地址后如何能夠使用 如何加速Oracle大批量數(shù)據(jù)處理 Oracle刪除表的幾種方法