首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle 字元型別五大家族:CHAR、VARCHAR2、LONG、NCHAR、NVARCHAR2 深度解析

     編輯:Oracle 資料庫基礎

五大型別對照表

型別長度語意最大長度 (PL/SQL)最大長度 (資料欄)儲存特性字元集
CHAR字元32,7672,000定長,空格補齊資料庫字元集
VARCHAR2字元/位元組32,7674,000 (12c+ 32,767*)變長,不補齊資料庫字元集
LONG位元組32,7602 GB變長,**已棄用**資料庫字元集
NCHAR字元32,7672,000定長,空格補齊**國家字元集** (NLS_NCHAR_CHARACTERSET)
NVARCHAR2字元32,7674,000變長**國家字元集**

* 12c `MAX_STRING_SIZE=EXTENDED` 時,VARCHAR2/NVARCHAR2/RAW 可達 32,767 位元組。

核心差異解析

1. CHAR vs VARCHAR2:定長 vs 變長

  • CHAR(10) 存 'abc' → 實際佔 10 位元組(含 7 個空格)。比較時 'abc' = 'abc ' 為 TRUE(Blank-padded semantics)。
  • VARCHAR2(10) 存 'abc' → 實際佔 3 位元組(+1~2 位元組長度前綴)。比較時 'abc' != 'abc '(Non-padded semantics)。
  • **效能**:CHAR 固定位移存取略快,但浪費空間;VARCHAR2 節省空間、減少 I/O,**現代系統首選 VARCHAR2**。

2. VARCHAR2 vs VARCHAR:Oracle 專有 vs ANSI 標準

  • VARCHAR2:Oracle 保證**向上/向下相容**,語意永不改變。**強烈建議使用**。
  • VARCHAR:ANSI 標準型別,Oracle 目前同義於 VARCHAR2,**但未來版本可能遵循標準改變語意**(如空字串處理),**勿使用**。

3. LONG:歷史遺產,必須移轉

  • 單表僅 1 個 LONG 欄,不可出現在 WHERE/ORDER BY/GROUP BY、索引、PL/SQL 變數限制多。
  • **移轉目標**:CLOB(字元)或 BLOB(二進制)。
    工具:TO_LOB()(僅 CREATE TABLE AS SELECT 可用)、DBMS_LOB、Data Pump。

4. NCHAR/NVARCHAR2:國家字元集隔離

  • 獨立於資料庫字元集,由 NLS_NCHAR_CHARACTERSET 決定(通常 AL16UTF16 或 UTF8)。
  • **優勢**:多語言混存時,國家字元集欄位不受資料庫字元集變更影響,避免轉換損失。
  • **代價**:固定 2/3/4 位元組/字元(AL16UTF16 固定 2),儲存英文較浪費;應用需用 N'字串' 字面值。
  • **建議**:資料庫字元集統一用 **AL32UTF8**,則**無需 N 類型**,簡化架構。

5. 位元組 vs 字元語意:多位元組環境陷阱


-- 資料庫字元集 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)
  • **BYTE**:限制位元組數,**預設**。
  • **CHAR**:限制字元數,自動換算位元組上限。
  • **最佳實踐**:建表明確指定 VARCHAR2(n CHAR),或資料庫層級設定 NLS_LENGTH_SEMANTICS=CHAR(需謹慎,影響所有隱含定義)。

選型決策樹

  1. **大文本 (>4000 字元)** → CLOB / NCLOB。
  2. **二進制** → BLOB / BFILE。
  3. **一般字串** → VARCHAR2(n CHAR)。
  4. **固定長度代碼/旗標** → CHAR(1) / CHAR(n)。
  5. **多語言混存且資料庫非 UTF8** → 考慮 NVARCHAR2(但建議改用 AL32UTF8)。
  6. **避開** → LONG、VARCHAR、隱含 BYTE 語意。

結語

字元型別選型核心三原則:**用 VARCHAR2 代替 CHAR/LONG/VARCHAR**、**用 AL32UTF8 統一字元集免用 N 類型**、**明確指定 CHAR 語意避免多位元組截斷**。遵循此三原則,可消除 90% 的字元集亂碼、截斷、遷移相容性問題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved