最近在查詢某個遊戲的時候出了一點小差錯,結果導致怎麼查都查不出數據,找了好久才發現是因爲char跟varchar的原因,因此把char跟varchar的區別在這裏講一下:
假設有這麼一張表:
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會自動去掉後面的空格,查詢結果就正確了,這就是char跟varchar的區別,可以用這個例子來演示一下char跟varchar:
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',這樣也是可以得到正確的結果的。