| 型別 | 長度語意 | 最大長度 (PL/SQL) | 最大長度 (資料欄) | 儲存特性 | 字元集 |
|---|---|---|---|---|---|
| CHAR | 字元 | 32,767 | 2,000 | 定長,空格補齊 | 資料庫字元集 |
| VARCHAR2 | 字元/位元組 | 32,767 | 4,000 (12c+ 32,767*) | 變長,不補齊 | 資料庫字元集 |
| LONG | 位元組 | 32,760 | 2 GB | 變長,**已棄用** | 資料庫字元集 |
| NCHAR | 字元 | 32,767 | 2,000 | 定長,空格補齊 | **國家字元集** (NLS_NCHAR_CHARACTERSET) |
| NVARCHAR2 | 字元 | 32,767 | 4,000 | 變長 | **國家字元集** |
* 12c `MAX_STRING_SIZE=EXTENDED` 時,VARCHAR2/NVARCHAR2/RAW 可達 32,767 位元組。
CHAR(10) 存 'abc' → 實際佔 10 位元組(含 7 個空格)。比較時 'abc' = 'abc ' 為 TRUE(Blank-padded semantics)。VARCHAR2(10) 存 'abc' → 實際佔 3 位元組(+1~2 位元組長度前綴)。比較時 'abc' != 'abc '(Non-padded semantics)。TO_LOB()(僅 CREATE TABLE AS SELECT 可用)、DBMS_LOB、Data Pump。NLS_NCHAR_CHARACTERSET 決定(通常 AL16UTF16 或 UTF8)。N'字串' 字面值。
-- 資料庫字元集 ZHS16GBK (雙位元組)
CREATE TABLE t (c1 VARCHAR2(200 BYTE), c2 VARCHAR2(200 CHAR));
INSERT INTO t VALUES (RPAD('中',100,'中'), RPAD('中',100,'中'));
-- c1: 200 位元組 = 100 中文字元 → 成功
-- c2: 200 字元 = 400 位元組 → 失敗 (ORA-12899)
VARCHAR2(n CHAR),或資料庫層級設定 NLS_LENGTH_SEMANTICS=CHAR(需謹慎,影響所有隱含定義)。字元型別選型核心三原則:**用 VARCHAR2 代替 CHAR/LONG/VARCHAR**、**用 AL32UTF8 統一字元集免用 N 類型**、**明確指定 CHAR 語意避免多位元組截斷**。遵循此三原則,可消除 90% 的字元集亂碼、截斷、遷移相容性問題。