Oracle Char型別


在本教學中將學習Oracle CHAR資料型別,它是一種固定長度的字串型別。

Oracle CHAR資料型別簡介

Oracle CHAR資料型別用於儲存固定長度的字串。 CHAR資料型別可以儲存12000位元組的字串。

要定義一個CHAR列,需要用位元組或字元來指定一個字串長度,如下所示:

CHAR(length BYTE)
CHAR(length CHAR)

如果沒有明確指定BYTECHAR,那麼Oracle會預設使用BYTE

如果像下面的例子那樣不指定長度,那麼長度的預設值是1

column_name CHAR

插入或更新固定長度字串列時,Oracle將字元儲存為固定長度資料。 這意味著如果儲存的值的長度小於列中定義的最大長度,則Oracle將空格填充到最大長度的字串。 如果插入一個長度大於列的值,Oracle會返回一個錯誤。

Oracle使用空格填充後來比較CHAR值。

Oracle CHAR例子

下面來看看一些例子來理解CHAR資料型別的工作原理。

1. 空格使用的例子

首先,建立一個由CHAR列(x)和VARCHAR2列(y)組成的新表t。 每列的長度是10個位元組。

CREATE TABLE t (
    x CHAR(10),
    y VARCHAR2(10)
);

其次,用xy列的相同資料在t表中插入一個新行:

INSERT INTO t(x, y )
VALUES('Oracle', 'Oracle');

第三,通過使用以下查詢驗證插入:

SELECT
    *
FROM
    t

執行上面範例程式碼,得到以下結果 -

以下語句從t表中檢索資料:

SELECT
    x,
    DUMP(x),
    y,
    DUMP(y)
FROM
    t;

執行上面查詢程式碼,得到以下結果 -

在這個例子中,使用了DUMP()函式來返回xy列的詳細資訊:

字串Oracle需要6個位元組。 但是,Oracle在字串的右側再填充4個空格,使x列的長度為10個位元組。 y列的情況並非如此,因為y列的資料型別是可變長度字串型別:(VARCHAR2)

如果使用LENGTHB()函式來獲取xy列使用的位元組數,則更加清楚:

SELECT
    LENGTHB(x),
    LENGTHB(y)
FROM
    t;

執行上面查詢程式碼,得到以下結果 -

2. 字元比較範例

以下語句返回相同的結果:

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列在空間使用和字元比較方面的行為。