在 Oracle 數據庫的管理與開發過程中,理解數據類型的內部存儲格式至關重要。這不僅有助於分析塊轉储,也是崩潰診斷、存儲問題排查以及掌握內部事務機制的基礎。本文將系統梳理 Oracle 內置數據類型的內部構造,包括字符、數字、日期、LOB 等類型的存儲細節與內部代碼。
Oracle 提供豐富的數據類型,主要分為以下類別:
值得注意的是,數據類型本身並不存儲在數據塊中,而是記錄在數據字典(如 COL$ 表的 TYPE# 列)中。本文將重點使用 DUMP 函數來解析實際存儲格式。
96。存儲時不足長度部分以空格(ASCII 32)填充,因長度固定,易於識別填充空格。1。不進行空格填充,長度可變。分析 DUMP 輸出時,需知曉數據庫字符集(代碼頁)以正確解讀字節含義。
96。1。兩者使用國家字符集(如 AL16UTF16 或 UTF8)存儲,適合多語言環境。
Oracle 的 NUMBER 類型採用變長十進制科學記數法存儲,格式為:
<長度字節>, 符號位/指數字節, 數字1, 數字2, ..., 數字20
內部代碼為 2。FLOAT 共享相同的內部特性。
指數字節包含三部分:
計算公式:
指數 = 首字節 - 128 - 65指數 = (255 - 首字節) - 128 - 65 = 62 - 首字節偏移量設計使負數指數無需額外符號字節,巧妙實現了有序比較。
101 - 基數值 表示,最後附加字節 102 (0x66) 作為結束標記,確保排序正確性。例如:
<193, 5>(指數 0,數字 5)<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 等,內部採用固定長度結構存儲年月日時分秒及小數秒,此處不再展開。
112。113。114。LOB 數據可存儲在行內(小於 4KB)或行外段中,通過 Locator 指向實際數據。
69,包含數據對象號、相對文件號、塊號、行號。208。掌握 Oracle 數據類型的內部存儲格式,能夠幫助 DBA 和開發人員:
DUMP 函數輸出與塊轉储內容。建議結合 DUMP(column)、DBMS_STATS、塊轉储工具進行實踐驗證,深化理解。