測試使用字串型別要注意的地方

oracle_db發表於2012-05-30
目的:瞭解字串要怎麼應用

測試:

SQL> create table t
  2  (char_column char(20),
  3  varchar2_column varchar2(20)
  4  )
  5  /

Table created.

SQL> insert into t values ('hello world','hello world');

1 row created.

SQL> select * from t;

CHAR_COLUMN          VARCHAR2_COLUMN
-------------------- --------------------
hello world          hello world
這裡的CHAR_COLUMN列長度為20,自動把長度定死為20

SQL> select * from t where char_column = 'hello world';

CHAR_COLUMN          VARCHAR2_COLUMN
-------------------- --------------------
hello world          hello world

SQL> select * from t where varchar2_column = 'hello world';

CHAR_COLUMN          VARCHAR2_COLUMN
-------------------- --------------------
hello world          hello world

SQL> select * from t where char_column=varchar2_column;

no rows selected
這裡雖然兩列值從顯示來看一模一樣,但是並不相等,因為長度不一樣

SQL> select * from t where trim(char_column) = varchar2_column;

CHAR_COLUMN          VARCHAR2_COLUMN
-------------------- --------------------
hello world          hello world

SQL> select * from t where char_column = rpad( varchar2_column, 20 );

CHAR_COLUMN          VARCHAR2_COLUMN
-------------------- --------------------
hello world          hello world
這裡去掉CHAR列中的空格或者讓VARCHAR2增加空格到長度為20時,這兩列值就相等

使用繫結變數時要使用CHAR型別而不是VARCHAR2,為什麼?

測試:以一使用VARCHAR2型別來進行繫結變數操作


SQL> variable varchar2_bv varchar2(20)
SQL> exec :varchar2_bv := 'hello world';

PL/SQL procedure successfully completed.

SQL> select * from t where char_column = :varchar2_bv;

no rows selected
這個時候長度不等,繫結變數不會成功
SQL> select * from t where varchar2_column = :varchar2_bv;

CHAR_COLUMN          VARCHAR2_COLUMN
-------------------- --------------------
hello world          hello world

SQL> 

測試:以下以CHAR型別來進行繫結變數操作

SQL> variable char_bv char(20)
SQL> exec :char_bv := 'hello world';

PL/SQL procedure successfully completed.

SQL> select * from t where char_column = :char_bv;

CHAR_COLUMN          VARCHAR2_COLUMN
-------------------- --------------------
hello world          hello world
這裡列長度相等,繫結成功

SQL> select * from t where varchar2_column = :char_bv;

no rows selected

SQL> 

總結:能不使用CHAR就不使用CHAR,都用VARCHAR2來操作字元資料!


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15720542/viewspace-731471/,如需轉載,請註明出處,否則將追究法律責任。

相關文章