Oracle中char與varchar的區別

 最近在查詢某個遊戲的時候出了一點小差錯,結果導致怎麼查都查不出數據,找了好久才發現是因爲charvarchar的原因,因此把charvarchar的區別在這裏講一下:

假設有這麼一張表:

game:

game_name

ticket_count

total_amount

LG20120807

1000

200000

LG20120808

1500

250000

LG20120809

 

 

我想查詢某個game的信息,用game name作爲查詢條件,一開始我的程序如下:

declare
  gname            char(
30) := 'LG20120807'; --注意這裏我當時用的是char型,錯誤做法

  --gname         varchar(30) := 'LG20120807'; --正確做法,改正後用這個
  v_ticket_count number;
  v_total_amount number;
begin
  select g.game_name, g.ticket_count, g.total_amount
    into v_game_name, v_ticket_count, v_total_amount
    from game g
   where g.game_name = gname;--
結果在判斷這個條件時怎麼都沒有匹配項,如果這裏gname改成'LG20120807'就可以查到結果
  dbms_output.put_line(
'game: ' || v_game_name);
  dbms_output.put_line(
'ticket: ' || v_ticket_count);
  dbms_output.put_line(
'total amount: ' || v_total_amount);
end;

結果怎麼都無法查詢出我想要的結果來,後來把char改成varchar後,結果就正確了。這是因爲char型會包括空格在內,像我這裏聲明瞭char(30),因此這裏的gname就是'LG20120807                   '後面跟着20個空格,所以在where條件那裏匹配的時候就無法匹配正確了,數據庫中只有'LG20120807',但是當我把char(30)改成varchar(30)後,varchar會自動去掉後面的空格,查詢結果就正確了,這就是charvarchar的區別,可以用這個例子來演示一下charvarchar:

declare
  my_char     char(15) := ‘mychar’;
  my_varchar varchar(15) := ‘myvarchar’;
begin
  dbms_output.put_line(
'char: ' || my_char || 'hi');
  dbms_output.put_line(
'varchar: ' || my_varchar || 'hi');
end;

輸出結果爲:

char: mychar         hi

varchar: myvarcharhi

這裏就可以看出char類型是保留空格的,而varchar則自動去掉空格。

假如最先開始我的程序中將gname char(30) := 'LG20120807'改成gname char(10) := 'LG20120807',這樣也是可以得到正確的結果的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章