熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

Oracle中的Char與Varchar的區別和實例

2022-06-13   來源: Oracle 

   CHAR的長度是固定的而VARCHAR的長度是可以變化的 比如存儲字符串“abc"對於CHAR ()表示你存儲的字符將占個字節(包括個空字符)在數據庫中它是以空格占位的而同樣的VARCHAR ()則只占用個字節的長度只是最大值當你存儲的字符小於按實際長度存儲

  CHAR的效率比VARCHAR的效率稍高看來cscm_number應該設成 char()

  目前VARCHAR是VARCHAR的同義詞工業標准的VARCHAR類型可以存儲空字符串但是Oracle不這樣做盡管它保留以後這樣做的權利Oracle自己開發了一個數據類型VARCHAR這個類型不是一個標准的VARCHAR它將在數據庫中varchar列可以存儲空字符串的特性改為存儲NULL值假如你想有向後兼容的能力Oracle建議使用VARCHAR而不是VARCHAR

  何時該用CHAR何時該用varchar?

  CHAR與VARCHAR是一對矛盾的統一體兩者是互補的關系 VARCHAR比CHAR節省空間在效率上比CHAR會稍微差一些即要想獲得效率就必須犧牲一定的空間這也就是我們在數據庫設計上常說的‘以空間換效率’ VARCHAR雖然比CHAR節省空間但是假如一個VARCHAR列經常被修改而且每次被修改的數據的長度不同這會引起‘行遷移’(Row Migration)現象而這造成多余的I/O是數據庫設計和調整中要盡力避免的在這種情況下用CHAR代替VARCHAR會更好一些

  關於char和varchar的比較

  char類型與char型或字符常量的比較在比較時使用補齊空格的方式進行比較

  varchar類型與varchar類型char型和字符常量的比較在比較時不補充空格直接比較

  create table tt(A CHAR() A VARCHAR()) ;

  INSERT INTO TT VALUES(AA) ;

  insert into tt values(AA ) ;

  COMMIT ;

  CHAR型與字符常量的比較字符常量作為char型處理

  A比較返回也就是在比較時自動將常量A右補齊空格後比較

  select * from tt where a=A ;

  A A

  

  A A

  A A

  A 比較返回也就是在比較時自動將常量A右補齊空格後比較

  select * from tt where a=A ;

  A A

  

  A A

  A A

  VARCHAR與常量的比較字符常量作為varchar型處理

  A比較返回也就是在比較時對A不做處理直接比較

  select * from TT WHERE A=A;

  A A

  

  A A

  A 比較返回也就是在比較時對A不做處理直接比較

  select * from TT WHERE A=A ;

  A A

  

  A A

  當CHAR類型和VARCHAR類型比較時比較時對字段值是不作處理直接比較的

  讓A和A直接比較此時是直接比較有一條記錄的A和A相同

  select * from tt where a=a ;

  A A

  

  A A

  但是當和decode函數配合使用時出現不同的情況

  使用A字段

  select decode(aAAAAABBBB) FROM TT ;

  DECODE(AAAAAABBBB)

  

  BBBB

  BBBB

  雖然A字段為char()但是比較時並沒有將常量A補空格再與字段A做比較而是直接進行比較也就是將兩個比較字段按照varchar類型處理的

  因此比較時認為字段A不等於常量A出現兩條結果為BBB的記錄

  進一步驗證

  select decode(aA AAAABBBB) FROM TT ; 此處是兩個空格

  DECODE(AAAAAABBBB)

  

  BBBB

  BBBB

  還是返回兩條BBB的記錄說明比較的不是按照char型的比較規則處理的

  使用A字段

  select decode(aAAAAABBBB) FROM TT ;

  DECODE(AAAAAABBBB)

  

  AAAA

  BBBB

  此時是正常的VARCHAR類型之間的比較第一條記錄的A字段等於A返回AAA第二行記錄的A字段為’A 比較時不等返回BBB

  當使用case表達式處理A字段時出現了與decode函數不同的處理結果

  使用字段A

  select case a when A then AAA else BBB end from tt ;

  CASEAWHENATHENAAAELSEBBB

  

  AAA

  AAA

  在使用case語句中使用A字段與常量A比較時兩個比較值按照char型的比較規則處理在右補空格之後進行比較因此返回兩條記錄

  進一步驗證如下

  select case a when A then AAA else BBB end from tt ;

  CASEAWHENATHENAAAELSEBBB

  

  AAA

  AAA

  此時將常量改為A 比較時仍視為char類型之間的比較將字段A補齊空格後與常量比較

  使用A字段

  select case a when A then AAA else BBB end from tt ;

  CASEAWHENATHENAAAELSEBBB

  

  AAA

  BBB

  此時是正常的VARCHAR類型之間的比較第一條記錄的A字段等於A返回AAA第二行記錄的A字段為’A 比較時不等返回BBB

  總結

  在使用decode函數對char字段做比較時需要注意即使比較的兩個字段都是char類型但是decode函數是將其轉化varchar類型 進行處理不遵循char型的比較規則

  對於char數據在集合操作中按照char的實際數據進行比較而不是按照char型數據的比較規則進行的

  下面是一個簡單例子

  create table t(name char()) ;

  create table t(name char()) ;

  begin

  for i in loop

  insert into t values(to_char(i)) ;

  insert into t values(to_char(i)) ;

  end loop ;

  commit;

  end ;

  select name from t minus select name from t ;

  NAME

  

  

  

  

  

  

  如果按照char型的比較規則則不應該有返回值

  select anem from t intersect select name from t ;

  NAME

  

  無返回值也說明集合操作時比較沒有按照char型的比較規則

  ===============================評論============================

  對於decode和case對於char類型的差別原因是由於case是表達式而decode是函數

  函數中輸入參數和返回值一般都定義為varchar類型

  多謝指點一時沒有想到這裡看了一下decode函數的定義如你所述在使用decode的函數對char型數據進行類型轉換

  下面是decode的函數的參數定義

  SQL> desc sysstandarddecode

  Parameter Type Mode Default?

  

  (RESULT) NUMBER

  EXPR NUMBER IN

  PAT NUMBER IN

  RES NUMBER IN

  (RESULT) VARCHAR

  EXPR NUMBER IN

  PAT NUMBER IN

  RES VARCHAR IN

  (RESULT) DATE

  EXPR NUMBER IN

  PAT NUMBER IN

  RES DATE IN

  (RESULT) NUMBER

  EXPR VARCHAR IN

  PAT VARCHAR IN

  RES NUMBER IN

  (RESULT) VARCHAR

  EXPR VARCHAR IN

  PAT VARCHAR IN

  RES VARCHAR IN

  (RESULT) DATE

  EXPR VARCHAR IN

  PAT VARCHAR IN

  RES DATE IN

  (RESULT) NUMBER

  EXPR DATE IN

  PAT DATE IN

  RES NUMBER IN

  (RESULT) VARCHAR

  EXPR DATE IN

  PAT DATE IN

  RES VARCHAR IN

  (RESULT) DATE

  EXPR DATE IN

  PAT DATE IN

  RES DATE IN

  (RESULT) SYSSTANDARD

  EXPR SYSSTANDARD IN

  PAT SYSSTANDARD IN

  RES SYSSTANDARD IN

  (RESULT) SYSSTANDARD

  EXPR SYSSTANDARD IN

  PAT SYSSTANDARD IN

  RES SYSSTANDARD IN


From:http://tw.wingwit.com/Article/program/Oracle/201311/19034.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.