3.放棄CHAR吧,在鑄成大錯之前!

來源:互聯網
上載者:User

標籤:使用   資料   cti   代碼   io   應用   

/*************************************************
三、主題:放棄CHAR吧,在鑄成大錯之前!

CHAR,定長,長度不足時,會在尾部補空格。
VARCHAR,不定長,長度不一定達到最大值。
*************************************************/

=============================================================================
3.1.length,返回字元長度的函數
The LENGTH functionsreturn the length of char. LENGTH calculates length usingcharacters as defined by the input character set.
     --返回以字元為單位的長度.
LENGTHB usesbytes instead of characters.
     --返回以位元組為單位的長度.
LENGTHC usesUnicode complete characters.
     --返回以Unicode完全字元為單位的長度.
LENGTH2 usesUCS2 code points.
     --返回以UCS2代碼點為單位的長度.
LENGTH4 usesUCS4 code points.
    --返回以UCS4代碼點為單位的長度.
=============================================================================
    CREATE TABLE TEST4
    (
      C CHAR(4),
      VC VARCHAR(4),
      NC VARCHAR(4)
    );

    INSERT INTO TEST4 VALUES(‘1‘,‘12‘,‘10‘);
    INSERT INTO TEST4 VALUES(‘3‘,‘3‘,‘210‘);
    INSERT INTO TEST4 VALUES(‘ ‘,‘110‘,‘1300‘);
    INSERT INTO TEST4 VALUES(‘25‘,‘ ‘,‘9‘); 
    INSERT INTO TEST4 VALUES(‘AA‘,‘HE‘,‘50‘);       
=============================================================================
3.2.CHAR 與 VARCHAR 的長度  
    SELECT C,LENGTH(C),VC,LENGTH(VC) FROM TEST4;--查詢結果:其中有C=‘1   ‘,明顯可以看到後面有空格
   
    SELECT C,LENGTH(C),LENGTHB(C),LENGTHC(C),DUMP(C),--DUMP:其中有C=‘1   ‘時,Typ=96 Len=4: 49,32,32,32,後面三個32表示空格
           VC,LENGTH(VC),LENGTHB(VC),LENGTHC(VC),DUMP(VC)--DUMP:明顯的區別,實際的長度,而不是最大長度
       FROM TEST4;

3.3.比較大小(常規字元型)      
   
    SELECT C,DUMP(C)
      FROM TEST4 ORDER BY C;--排序結果:‘ ‘ ,‘1‘,‘25‘,‘3‘,‘AA‘
     
    SELECT VC,DUMP(VC)
      FROM TEST4 ORDER BY VC;--排序結果:‘ ‘,‘110‘,‘12‘,‘3‘,‘HE‘

3.4.數值在排序中的效果比較,重要應用:字元型儲存資料全為數字時。
    SELECT NC,DUMP(NC)
      FROM TEST4
     ORDER BY NC;--排序結果:10,1300,210,50,9     
   --若是想將全為數位字元型進行排序,ORDER BY C+0  或者 ORDER BY TO_NUMBER(NC) 即可
    SELECT NC,DUMP(NC)
      FROM TEST4
     ORDER BY NC+0;--排序結果:9,10,50,210,1300
  
    SELECT NC,DUMP(NC)
      FROM TEST4
     ORDER BY TO_NUMBER(NC);--排序結果:9,10,50,210,1300

3.5.字串的比較
    填補空格的比較規則:若是長度不同,會在短的後面填補空格,等長度一致後比較;
                        自左往右順序比較,直到比較出不一致,或者比較完成。    
   (1)單純的字面值
      SELECT * FROM TEST4 WHERE C=‘1‘;  --能查出結果,正確的
     
   (2)VARCHAR 的值不會填補空格,所以TEST4的 CHAR ‘1   ‘ 與 TEST1的 VARCHAR2 ‘1‘ 不同  
      SELECT * FROM TEST4 WHERE C IN (SELECT NAME FROM TEST1);--0行被選擇,無查詢結果,其實TEST1 裡面有 ‘1‘.
      --原因
      SELECT DUMP(C),DUMP(NAME)
       FROM TEST4,TEST1
      WHERE TEST4.C=‘1‘
        AND TEST1.NAME=‘1‘
     結果:Typ=96 Len=4: 49,32,32,32 ; Typ=1 Len=1: 49.
    
   (3)要想得出正確結果,所以經常有 TRIM,RPAD 函數出現,但是不推薦
      SELECT * FROM TEST4 WHERE TRIM(C) IN (SELECT NAME FROM TEST1);--TEST4 清除空格, 查詢結果有值
      SELECT * FROM TEST4 WHERE C IN (SELECT RPAD(NAME,4) FROM TEST1); --TEST1 填充空格,查詢結果有值

   --若是有CHAR存在,每次比較時,可能就要加上一些字元的函數。
   --CHAR浪費空間,並且可能查詢中連索引都使用不上。
  
3.6.結論:放棄CHAR吧,在鑄成大錯之前!   


    
               

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.