最近在查询某个游戏的时候出了一点小差错,结果导致怎么查都查不出数据,找了好久才发现是因为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',这样也是可以得到正确的结果的。