為什麼MySQL對SQL標準的支持那麼不誠意?

最近開始學資料庫,看了網上的推薦用了MySQL,結果發現這軟體相當不羈,很多SQL標準中很基本的用法(比如集合的交)都不支持。感覺很奇怪啊,這麼出名的開源軟體怎麼會連這個都不做。


大家本來就不是那麼在乎。套路一般是,MySQL不支持XX功能?那我就在自己的應用層模擬實現一個就行了。既然如此,MySQL也就沒多少動力跟進。

相當長一段時間裡,RDBMS領域的政治正確是Oracle貴,Sql Server傻,Postgres慢,只有我MySQL千秋萬代一桶漿糊。

到了現在,雖然Postgres(本來也)不慢了,Sql Server(本來也)不傻了,然而歷史慣性已經形成了,大把的app都是基於MySql開發,大把的主頁空間都是現成配好的MySql,大家也就繼續跟了。


當初mysql開始流行的時候,還只有表鎖呢,然後人們把他當NoSql用。人民群眾的忍耐力是無窮的。


有這個疑問是可以理解的,比如,我工作以後才知道,原來很多業務用資料庫,不允許用外鍵的,簡直和我畢生所學相反。

MySQL(題主注意MySQL和SQL這兩個關鍵字的拼寫)的SQL或許不標準,但是它實現了完整的4個事務隔離級別,而Oracle並沒有。所以,和看人一樣,不要盯著它的缺點,要善於發現它的優點。

MySQL能夠成為世界上最流行的開源資料庫,絕不僅僅是因為免費。PostgreSQL也是免費的啊,但是沒有成為最流行的開源資料庫。


開源軟體不都是這樣的,不爽不要玩,不爽就來contribute,不爽就去自己寫一個

當初學MySQL的時候,卧槽?unique(還是not null)實際上不做任何檢查?什麼鬼

然後我資料庫大作業特別針對性增加了unqiue(和not null)欄位的檢查。


SQL92里有交集函數?


當年, 在微軟.net技術棧下開發應用,用的就是sql server資料庫。 在特性方面, 不僅緊跟sql標準的步伐,還有自身特有的功能, 用的時候簡直爽到飛起來。 程序的業務邏輯, 基本上能在資料庫實現的就絕不會寫到代碼裡面,久而久之, 程序代碼基本上已經沒什麼東西了,就用來作為界面和資料庫的中轉而已。 而且,sql server強大之處在於, 儘管邏輯全寫在資料庫中,但是只要不瞎胡鬧,性能方面基本沒什麼問題出現, 再加上以visual studio為基礎的 management studio,就覺得.net和c#根本沒什麼卵用了, 直接資料庫可以搞定一切。 不光是我, 似乎大多數.net系開發者都是這麼做的。

後來跳了槽, 從.net系轉到了php、java系, 用的是mysql資料庫, 然後我把之前開發sql server應用程序的那套思路搬了過來開發mysql應用, 結果被同事和上級各種吐槽各種阻攔, 他們認為存儲過程、觸發器、視圖、複雜查詢之類的程序性能的毒藥,而且還影響代碼的可維護性,然而卻拿不出充分的理由,但是既然他們都堅持, 那我自己特立獨行也沒這個必要, 畢竟他們人多勢眾, 我新來咋到也不能太張楊。 另外, mysql沒有一個像樣的IDE,類似於navicat for mysql這種客戶端根本沒法和Microsoft SQL Server Management Studio相比,寫起sql代碼來要多不爽就有多不爽。 久而久之, 資料庫在我的眼裡就只剩增刪查改功能可以用了。

所以, 我覺得mysql對sql標準支持的不完善的原因在於,因為這些特性本來就不是必要的, 完全可以用程序來實現,對於基於mysql程序的開發者說,完全是可有可無的, 而且還有可能引起某些極端分子的不滿,既然如此,那mysql團隊自然不會有動力去開發這些功能, 因為開發者根本沒有強烈的需求需要這些功能,這可能就是所謂的mysql文化吧。 另外,如果誰能開發出一套類似於sql server那樣的數據配套工具, 那說不定能培養出一批像微軟技術棧那樣開發者, 把sql能發揮的威力全炸出來, 到時候說不定mysql團隊對於sql標準支持的腳本也會漸漸跟上了。


免費就是最大的feature


因為開發者不收你錢 , 也沒求你用 , 人家愛怎麼來就怎麼來

滑稽.jpg

補充輪子哥的話

人民群眾(對免費的東西)忍耐力是無窮的。


最近被mysql坑死了,天天費力的向別人解釋為什麼mysql這個不支持,那個使用有限制,這個行為是mysql特有的,跟其他資料庫不一樣。

有錢買個oracle算了,用什麼mysql. 說不定交的學費都夠買oracle的license了。


其實我是這麼想的,工具而已,用什麼樣的工具做什麼樣的任務,用它優秀的地方避開它的坑,各種關係型資料庫非關係型資料庫都有它的優劣,不說mysql,也很多人吐槽mongodb的不倫不類不好維護,也有很多人喜歡它的文檔型存儲它基於replication的比較有效的容災機制。反正,需要它,搞它。


因為MySQL並不是一個SQL database,其實它只是一個有SQL界面的文件系統。


這不是給了你大把的鍛煉機會,想辦法在應用層解決業務邏輯問題嘛。


為啥都不用SQL Server呢?只是因為不免費嗎?


不是不會做,是每種dbms有不同的標準。sql語句dml,dcl,ddl都是資料庫通用的,MySQL主要的語句是Tsql,Oracle用的是plsql。就好比都是中國人,都會說普通話,但是各地有各地的方言。MySQL沒必要去兼容所有的語法吧,大家照樣用的好好的。


不同人理解不一樣吧

我一開始學習的時候,啟蒙老師就說

不要把邏輯用在mysql層

能用邏輯外鍵就不要用事實外鍵

少用觸發器等等影響性能

就潛移默化認為是性能毒藥了

--------

後來發現,事實外鍵還是有人用的

但自己習慣已經很難改,很不喜歡把報錯級別上升到資料庫級別,不如程序級別可控,就像後來migration那種資料庫版本管理工具的理念一樣

--------

還是習慣+除非有特殊的業務需求,技術是跟著需求走的


Not in 直接排除空值


因為不支持的東西用支持的東西三兩句就搞出來了嘛


或許MySQL設計的初衷就是不要將大量業務邏輯寫在sql里的吧。


來源的有已經不錯了,有錢去玩oracle


都是流行惹得禍。。。。

就開源領域說

MySQL : the most popular database

PostgreSQL : the most advanced database

用MySQL我是很不習慣。


推薦閱讀:

SQL 設計得爛嗎,諸如redis,nosql又該如何選擇?
什麼是最好的oracle sql 開發工具?
sql server中如何儘可能高效地把表導出成excel,有好幾億條數據?
誰有精簡的SQLSerVer安裝包,聽說有一種只有28M?
win7如何安裝SQL資料庫2000?

TAG:資料庫 | SQL | MySQL | 計算機 |