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

深入解析 Oracle 基本數據類型的內部存儲結構

     編輯:Oracle 資料庫基礎

前言

在 Oracle 數據庫的管理與開發過程中,理解數據類型的內部存儲格式至關重要。這不僅有助於分析塊轉储,也是崩潰診斷、存儲問題排查以及掌握內部事務機制的基礎。本文將系統梳理 Oracle 內置數據類型的內部構造,包括字符、數字、日期、LOB 等類型的存儲細節與內部代碼。

Oracle 數據類型體系概覽

Oracle 提供豐富的數據類型,主要分為以下類別:

  • 內置數據類型:如 CHAR、VARCHAR2、NUMBER、DATE、RAW、LONG、LOB 類型(CLOB、BLOB、NCLOB、BFILE)、ROWID/UROWID 等。
  • 用戶自定義數據類型:包括物件類型、集合類型(VARRAY、嵌套表)、REF 類型等。

值得注意的是,數據類型本身並不存儲在數據塊中,而是記錄在數據字典(如 COL$ 表的 TYPE# 列)中。本文將重點使用 DUMP 函數來解析實際存儲格式。

字符類型內部存儲詳解

CHAR 與 VARCHAR2(單字節字符集)

  • CHAR:固定長度字符串,最大 2000 字符,內部代碼 96。存儲時不足長度部分以空格(ASCII 32)填充,因長度固定,易於識別填充空格。
  • VARCHAR2:變長字符串,最大 4000 字符,內部代碼 1。不進行空格填充,長度可變。

分析 DUMP 輸出時,需知曉數據庫字符集(代碼頁)以正確解讀字節含義。

NCHAR 與 NVARCHAR2(多字節國家字符集)

  • NCHAR:固定長度,最多 2000 字節,內部代碼 96。
  • NVARCHAR2:變長,最多 4000 字節,內部代碼 1。

兩者使用國家字符集(如 AL16UTF16 或 UTF8)存儲,適合多語言環境。

數字類型(NUMBER)的內部編碼機制

Oracle 的 NUMBER 類型採用變長十進制科學記數法存儲,格式為:

<長度字節>, 符號位/指數字節, 數字1, 數字2, ..., 數字20

內部代碼為 2。FLOAT 共享相同的內部特性。

指數字節結構

指數字節包含三部分:

  • 符號位:最高位(值 128)。0 表示負數,1 表示正數或零。
  • 偏移量:固定為 65。
  • 指數值:範圍 -65 到 62,表示以 100 為基數的科學記數法指數。

計算公式:

  • 若首字節 > 128(正數):指數 = 首字節 - 128 - 65
  • 若首字節 < 128(負數):指數 = (255 - 首字節) - 128 - 65 = 62 - 首字節

偏移量設計使負數指數無需額外符號字節,巧妙實現了有序比較。

數字字節存儲規則

  • 基數為 100,每個數字字節範圍 0-99(實際存儲 1-100,0 保留為結束標記,兼容性保留)。
  • 正數:各位使用進位表示(1 代表 0,100 代表 99)。
  • 負數:各位使用 101 - 基數值 表示,最後附加字節 102 (0x66) 作為結束標記,確保排序正確性。

例如:

  • +4 存儲為 <193, 5>(指數 0,數字 5)
  • -4 存儲為 <62, 97, 102>(指數 62,數字 97=101-4,結束符 102)

這種設計使得正負數、長短數字在字節級比較時均能得到正確的大小順序。

數值範圍與精度限制

理論範圍:1×100^(-65) ≈ 1×10^(-130) 到 99×100^62 + ... ≈ 1×10^126。但最大精度限制為 38 位,超出部分會四捨五入;存儲超過 21 字節會報溢出錯誤。

日期時間與間隔類型

包括 DATE、TIMESTAMP、INTERVAL YEAR TO MONTH、INTERVAL DAY TO SECOND 等,內部採用固定長度結構存儲年月日時分秒及小數秒,此處不再展開。

LOB 與大對象類型

  • CLOB/NCLOB:字符大對象,內部代碼 112。
  • BLOB:二進制大對象,內部代碼 113。
  • BFILE:外部二進制文件引用,內部代碼 114。

LOB 數據可存儲在行內(小於 4KB)或行外段中,通過 Locator 指向實際數據。

ROWID 與 UROWID

  • ROWID:物理行地址,內部代碼 69,包含數據對象號、相對文件號、塊號、行號。
  • UROWID:通用行標識符,支援索引組織表等,內部代碼 208。

總結

掌握 Oracle 數據類型的內部存儲格式,能夠幫助 DBA 和開發人員:

  1. 準確解讀 DUMP 函數輸出與塊轉储內容。
  2. 在崩潰恢復、數據損壞分析中快速定位問題。
  3. 優化存儲設計,理解字符集遷移、數據類型轉換的底層行為。
  4. 為高級調優(如壓縮、加密、In-Memory)打下堅實基礎。

建議結合 DUMP(column)、DBMS_STATS、塊轉储工具進行實踐驗證,深化理解。

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