哪個 DBMS 更符合標準?
我發現相同的查詢在不同的 DBMS 中不起作用,這令人沮喪。
例如,一些 DBMS(如 Microsoft SQL Server 和 MySQL)似乎支持該
information_schema
表,而另一些(如 SQLite)則不支持。一些數據庫,如 MySQL 允許你做
SHOW TABLES
,等等。有些限制使用結果,
SELECT TOP 10 ...
而另一些則使用... LIMIT 10
.為什麼不同的 DBMS 如此不兼容和偏差?
他們為什麼不遵循 SQL 標準?
哪些擅長遵守 SQL 標準?
哪些在遵守 SQL 標準方面出了名的糟糕?
我發現相同的查詢在不同的 DBMS 中不起作用,這令人沮喪。
是的。我發現不同汽車的大燈和雨刷控制裝置並不總是在同一個地方,這讓我感到沮喪。既然無法控制,我就學會忍受它。我通常堅持某些汽車品牌,但這些東西的位置並不接近主要決策標準列表的頂部。同樣,我不會選擇數據庫平台,因為它們涵蓋的標準百分比或多少查詢與 Oracle 和 MySQL 中的工作方式相同。
例如,一些 DBMS(如 Microsoft SQL Server 和 MySQL)似乎支持 information_schema 表,而其他(如 SQLite)不支持。
INFORMATION_SCHEMA
是一個有趣的選擇。是的,一些平台選擇根本不支持該標準。其他人已經涵蓋了最低限度。我強烈反對在 SQL Server 中使用INFORMATION_SCHEMA
,例如:一些數據庫如 MySQL 允許你做 SHOW TABLES 等。
好吧,是的,有些數據庫比其他數據庫更臭名昭著,因為它們只是編造了當時對開發人員來說似乎對程式碼很有意義的東西(
LIMIT
還有他們不正當的GROUP BY
寬恕是其他例子)。為什麼不同的 DBMS 如此不兼容和偏差?
我敢肯定有些人會這樣做,
SHOW TABLES
因為這被認為比SELECT name, other cols FROM sys.tables;
. 事實上,我敢打賭這就是世界上大多數程式碼庫的問題,包括 RDBMS;人們傾向於做容易的事而不是正確的事。但是我不確定不同的平台不兼容並且正如你所說的那樣“偏離”是一個問題。
他們為什麼不遵循 SQL 標準?
涵蓋整個標準很難。僅覆蓋標準更難。供應商開發標準的擴展,以及標準未(尚未)涵蓋的專有功能,為使用者提供更強大的平台。想像一下,如果我們在開發任何東西之前坐等標準的下一次迭代?想像一下,如果所有平台都覆蓋了完整的標準,而只覆蓋了標準?想像一下,如果所有平台都只實現了他們都同意開發並同時發布的任何新功能?擁有不同的平台有什麼意義?它們都是一樣的,不兼容將不再是一個問題,因為你可以在平台之間自由切換而沒有風險——但是如果它們都是一樣的,你為什麼要這樣做呢?查看您正在“解決”的問題 - 它只會產生不同的問題。
以索引為例。該標準不關心物理實現,一些供應商已經決定實現各種有益的索引變體和物理儲存機制以改善他們的平台 - SQL Server 有過濾索引,包括列,XML 索引,全文索引,記憶體中的表、列儲存等等等等。在標準中你都不會讀到這些。因此,當他們開發這些東西時,他們應該如何使其與 Oracle 可能正在或可能不會開發或計劃的任何東西兼容?Postgres 繼續做出決定,詳細的 JSON 支持比並行處理的性能提升更重要。這很好,完全在他們的權利範圍內。這並不意味著我希望 SQL Server 做同樣的事情。
普通的臨時 CRUD 內容應該對於跨平台的基本 vanilla 表同樣有效(儘管即使在那裡,MySQL 也做了一些時髦的事情,比如預設情況下在表名周圍使用反引號,如果嘗試將程式碼移植到任何其他平台,則需要刪除這些內容)。一旦你開始在標準儲存和檢索之外做任何更奇特的事情,標準就會舉起手臂。你想要視窗函式嗎?好的,您需要您的供應商捲起袖子並實施它們,因為大多數平台都沒有它們,而且它們需要做很多工作;甚至 SQL Server 還沒有完成,但他們已經領先於其他人了。他們還有很多其他的語言功能,我很高興在那裡,儘管它們不在標準中。
哪些擅長遵守 SQL 標準?
哪些在遵守 SQL 標準方面出了名的糟糕?
我對完整標準和所有平台了解得不夠多,無法發表評論。但我會建議:如果這是您選擇一個或另一個平台的原因,請停止您現在正在做的事情,並問問自己為什麼這如此重要。我還將建議 SQL Server 在遵守標準和實施有益的擴展方面做得更好(回顧歷史,例如
timestamp
,是的,top
表明他們過去不太關心)。其他一些平台對標準豎起了中指,並繼續這樣做。