在本教學中將學習Oracle CHAR
資料型別,它是一種固定長度的字串型別。
Oracle CHAR
資料型別用於儲存固定長度的字串。 CHAR
資料型別可以儲存1
到2000
位元組的字串。
要定義一個CHAR
列,需要用位元組或字元來指定一個字串長度,如下所示:
CHAR(length BYTE)
CHAR(length CHAR)
如果沒有明確指定BYTE
或CHAR
,那麼Oracle會預設使用BYTE
。
如果像下面的例子那樣不指定長度,那麼長度的預設值是1
。
column_name CHAR
插入或更新固定長度字串列時,Oracle將字元儲存為固定長度資料。 這意味著如果儲存的值的長度小於列中定義的最大長度,則Oracle將空格填充到最大長度的字串。 如果插入一個長度大於列的值,Oracle會返回一個錯誤。
Oracle使用空格填充後來比較CHAR
值。
下面來看看一些例子來理解CHAR
資料型別的工作原理。
首先,建立一個由CHAR
列(x
)和VARCHAR2
列(y
)組成的新表t
。 每列的長度是10
個位元組。
CREATE TABLE t (
x CHAR(10),
y VARCHAR2(10)
);
其次,用x
和y
列的相同資料在t
表中插入一個新行:
INSERT INTO t(x, y )
VALUES('Oracle', 'Oracle');
第三,通過使用以下查詢驗證插入:
SELECT
*
FROM
t
執行上面範例程式碼,得到以下結果 -
以下語句從t
表中檢索資料:
SELECT
x,
DUMP(x),
y,
DUMP(y)
FROM
t;
執行上面查詢程式碼,得到以下結果 -
在這個例子中,使用了DUMP()
函式來返回x
和y
列的詳細資訊:
字串Oracle需要6
個位元組。 但是,Oracle在字串的右側再填充4
個空格,使x
列的長度為10
個位元組。 y
列的情況並非如此,因為y
列的資料型別是可變長度字串型別:(VARCHAR2)
。
如果使用LENGTHB()
函式來獲取x
和y
列使用的位元組數,則更加清楚:
SELECT
LENGTHB(x),
LENGTHB(y)
FROM
t;
執行上面查詢程式碼,得到以下結果 -
以下語句返回相同的結果:
SELECT * FROM t WHERE x = 'Oracle';
SELECT * FROM t WHERE y = 'Oracle';
但是,如果使用系結變數,效果是不同的。考慮下面的例子:
SQL> variable v varchar2(10)
SQL> exec :v := 'Oracle';
PL/SQL procedure successfully completed.
在這個程式碼塊中,將v
宣告為具有VARCHAR2
資料型別的系結變數。
現在,使用v
作為輸入來與x
列進行比較:
SQL> select * from t where x = :v;
no rows selected
該語句返回一個空的結果集。以下查詢使用v
變數與y
列進行比較:
SQL> select * from t where y = :v;
X Y
---------- ----------
Oracle Oracle
它按預期返回了一行。這是因為在比較長度不等的字元型別的字串時,Oracle使用非空格字元填充語意。
要使其工作,需要使用RTRIM()
函式從CHAR資料中去除空格,然後將其與輸入字串進行比較,如下所示:
SQL> select * from t where rtrim(x) = :v;
X Y
---------- ----------
Oracle Oracle
在本教學中,您已經了解了Oracle CHAR
資料型別,並了解了CHAR
列在空間使用和字元比較方面的行為。