Oracle資料庫是業界的翹楚,各行各業擁有大量的Oracle DB的DBA,本文嘗試通過将Oracle與MySQL資料庫的架構、安全、模式對象、資料類型及資料存儲進行對比,以友善熟悉Oracle資料庫的人可以快速了解MySQL。
MySQL與Oracle架構上不同,Oracle資料庫是一個多程序的架構,MySQL是一個多線程的架構。架構的不同導緻兩種資料庫對伺服器資源的開銷存在在很大的差異。

與Oracle一樣,MySQL使用者也由資料庫管理。MySQL使用一組授權表來跟蹤使用者及其所擁有的權限。MySQL使用這些授權表對使用者執行身份驗證,授權和通路控制。
與Oracle和大多數其他僅使用使用者名和密碼對使用者進行身份驗證的資料庫不同,MySQL使用location參數來對使用者進行身份驗證。location參數通常是主機名,IP位址或通配符(“%”)。MySQL可以使用該參數将使用者對資料庫的通路限制為域中的特定主機。它還允許使用者根據連接配接的不同主機,使用不同的密碼和權限。
MySQL的權限系統是通過繼承起作用的分層系統。在較進階别授予的權限将隐式傳遞到所有較低級别,但是在較低級别設定的相同權限可能優先。MySQL允許使用者按照以下權限範圍的降序授予五個不同級别的權限:
全局
每個主機
資料庫級
特定表
特定列(一個表中的一列)
資料庫中的每個級别都有一個對應的授權表。當執行權限檢查時,MySQL按照權限範圍的降序檢查每個表,在較低級别授予的權限優先于在較進階别授予的相同權限。
MySQL支援的權限分為兩種:管理權限和每個對象權限。管理權限是影響整個伺服器并與MySQL功能相關的全局權限。這些管理權限包括FILE,PROCESS,REPLICATION,SHUTDOWN和SUPER權限。每個對象的權限會影響資料庫對象,例如表,列,索引和存儲過程,并且可以在不同程度上進行授予。
模式包含表,視圖,索引,使用者,限制,存儲過程,觸發器和其他特定于資料庫的對象的定義。大多數關系資料庫都使用相似的對象。
Oracle和MySQL模式對象有許多相似之處。下表顯示了Oracle和MySQL之間的差別。
Oracle忽略對象名稱的大小寫。Oracle模式對象名稱以大寫形式存儲。
與Oracle一樣,MySQL列名稱,索引名稱,存儲過程名稱,觸發器名稱和列别名在所有平台上都不區分大小寫。但是,MySQL的資料庫名稱和表名稱的情況與Oracle的情況不同。MySQL的資料庫對應于資料目錄中的目錄,而表對應于資料庫目錄中的一個或多個檔案。是以,資料庫和表名的區分大小寫取決于作業系統的大小寫。這意味着資料庫和表名在Windows上不區分大小寫,但在大多數UNIX變體上都區分大小寫。但是,MySQL使用系統變量lower_case_table_names來确定資料庫和表名如何存儲在磁盤。
Oracle和MySQL允許将保留字加上引号用作對象名。但是,在MySQL中,一些保留字(例如DATE和TIMESTAMP)可以不使用引号。在Oracle中不允許這樣做。
MySQL和Oracle之間的辨別符定義之間有一些細微的差異。在MySQL中,未加引号的辨別符可以以數字開頭,并且帶引号的辨別符可以使用雙引号。但是,Oracle辨別符均不允許。MySQL的引号字元是反引号(`)。如果設定了SQL模式ANSI_QUOTES,則還可以使用雙引号将辨別符引起來。Oracle的辨別符用雙引号引起來。
另外需要注意的是,MySQL裡面沒有模式所有者的概念,即使是删除了使用者,該使用者建立的對象也不會被删除。
MySQL和Oracle在支援的字元類型以及存儲和檢索字元值的方式之間存在一些差異。
對于小于65,535位元組的字元類型,MySQL支援CHAR和VARCHAR。CHAR類型的最大長度為255個位元組。VARCHAR類型的最大長度為65,535位元組。Oracle支援四種字元類型(CHAR,NCHAR,NVARCHAR2和VARCHAR2)。可以為所有Oracle字元類型聲明的最小值是1個位元組。CHAR和NCHAR的最大大小為2,000位元組,NVARCHAR2和VARCHAR2的最大大小為4,000位元組。
存儲時,MySQLCHAR值将在右邊用空格填充到指定的長度,而在檢索時将尾随空格删除(SQL模式PAD_CHAR_TO_FULL_LENGTH除外)。另一方面,VARCHAR值是使用指定的确切字元數存儲的。如果值小于列長度,則Oracle會将CHAR和NCHAR值用空格填充,直到該值小于列長度,并且在檢索時不修剪尾随空白。對于NVARCHAR2和VARVHAR2資料類型的列,Oracle将存儲并檢索指定的值,包括尾随空格。
如果為字元類型列配置設定的值超過指定的長度,MySQL将截斷該值,并産生警告,如果設定了STRICT SQL模式,會生成錯誤。如果配置設定給字元類型列的值超過指定的長度,Oracle會報錯。
MySQL所有字元類型(CHAR,VARCHAR和TEXT)的列都有列的字元集和排序規則。如果未在列定義中明确定義字元集或排序規則,它将使用表的字元集或排序規則。如果未指定表的字元集或排序規則,則選擇資料庫字元或排序規則。Oracle的CHAR和VARCHAR2字元集由資料庫字元集定義,而NCHAR和NVARCHAR字元集由各個國家字元集定義。
在MySQL中聲明CHAR或VARCHAR類型時,預設長度是字元而不是位元組。Oracle中的預設長度,CHAR和VARCHAR2類型是位元組,NCHAR和NVARCHAR2類型是字元。
MySQL和Oracle處理列的預設值為NOT NULL方式不同。
MySQL将資料插入表中時确定列預設值。該預設值是列資料類型的隐式預設值。但是,如果啟用了STRICT模式,MySQL會生成錯誤,復原INSERT語句。
Oracle在将資料插入表中時,必須為所有NOT NULL的列指定資料。Oracle不會為具有NOT NULL限制的列生成預設值。
在MySQL中,臨時表是一個資料庫對象,僅對目前使用者會話可見,并且在使用者會話結束時會自動删除。
Oracle對臨時表的定義與MySQL稍有不同,因為一旦建立臨時表,該表将一直存在直到被顯式删除,并且對具有适當權限的所有會話都是可見的。但是,臨時表中的資料僅對将資料插入表中的使用者會話可見,并且在事務或使用者會話的整個生命周期内都可以保留資料。
下表比較了MySQL和Oracle數字類型。
下表比較了MySQL和Oracle日期時間類型。
下表比較了MySQL和Oracle字元串類型。
資料存儲是MySQL與幾乎所有資料庫(包括Oracle)不同的方面。在MySQL中,資料庫對應于伺服器資料目錄中的目錄。資料庫中的表對應于資料庫目錄中的一個或多個檔案,具體取決于表所使用的存儲引擎。
資料庫可以包含來自不同存儲引擎的表。存儲引擎負責存儲和檢索表資料。
MySQL提供了多種存儲引擎(以前稱為表類型),可以滿足各種環境的不同要求。
MySQL存儲引擎的職能包括保管資料、索引、使用記憶體 (資料緩存、緩沖)事務處理(ACID、XA、MVCC、隔離級别)和并發性(鎖、排他控制)。
Oracle資料庫由一個或多個表空間組成。表空間提供邏輯存儲,并将資料庫與儲存資料的實體磁盤連結。表空間是從一個或多個資料檔案建立的。資料檔案是檔案系統中的檔案或原始裝置指定的磁盤空間區域。可以通過添加資料檔案來擴大表空間。
Oracle資料庫由一個或多個存儲Oracle表的SYSTEM表空間組成。也可以使用使用者定義的表空間進行配置。表空間是資料庫對象的邏輯存儲位置。例如,使用者可以指定在表空間中的哪個位置建立特定的表或索引。
希望以上内容,能夠幫助熟悉Oracle資料庫的人快速了解MySQL。