2010-11-09 57 views
2

所以......發生時我正在研究一些代碼,這些代碼最終將同時在不同的sql服務器上使用。SQL兼容性圖表(特別是數據類型)

雖然SQL代碼因服務器而不同,但數據類型和列不同。

因此,我需要知道哪些是(至少大部分)sql服務器類型通用的數據類型。

作爲一個起點,我有以下幾種類型:

byte, char, float, int, text, varchar, blob 

請注意,拼寫是很重要的,因爲數據類型名稱將在查詢結束,因爲是(例如:雖然兩者int和整數支持,我需要普通的)。

所以,問題是,有沒有人知道一個圖表比較SQL服務器之間的兼容性?或者也許是在該領域做過一些研究的人?

就偏差而言,我明顯偏向於特定的RDBMS,所以不需要RDBMS更好的答案。讓我們繼續關注這個話題,好嗎?

回答

0

我會研究SQL ANSI標準規範並使用其中指定的數據類型。一本書like this可能會幫助你。

他們都有很好的文檔,所以我只會閱讀他們的數據類型。可能會有你需要的所有信息。我之前可以找到的only other informationpretty old

希望有所幫助。

編輯:只是另一個想法......你可以使用你的SQL的戰略模式,這樣它就不會有問題,如果它不同,你可以使用更高級的功能。儘管如此,你還有更多的工作要做,還有更多需要維護:/

+0

謝謝,非常有用的信息。關於「戰略模式」,我不確定我是否跟隨你。如在,它對我有什麼用處?正如在中,我已經遵循了這種模式,但是某些數據類型可能對某些RDBMS(例如「blob」)是排他性的。 – Christian 2010-11-09 11:08:31

+0

我雖然你可能能夠'插入'不同的類,以允許不同的功能,例如,如果 – 2010-11-09 11:25:12

+0

對不起,輸入按鈕不工作添加評論...認爲你可能能夠使用它來轉換不同的返回數據類型,或根據您插入到dao類的類運行不同的SQL ...請參閱http://www.dofactory.com/Patterns/PatternStrategy.aspx是否有意義?也許那不是你想要達到的目標? – 2010-11-09 11:26:57

1

我想你最終會爲每種類型的數據庫服務器編寫特定的CASY大小寫的SQL語句。當然,我做到了。

我一直在你的情況,包括有意編寫數據庫不可知的代碼,但從長遠來看,它不工作。例如,一個數據庫不會處理多字節字符串,而另一個數據庫會要求它們(例如SQL Server CE),這會迫使您在列上使用Varchar vs NVarchar。一些數據庫將支持多字節字符串,但性能糟糕。一個將使用VARCHAR2(Oracle),其他人將使用VARCHAR。一個人會以一種方式處理BLOB,而另一個人會以不同方式處理BLOB。不要讓我開始使用日期數據類型。

與其查找可在所有數據庫中工作的SQL語言和數據類型的神奇子集,您會更明智地尋找可以隱藏您的差異的數據訪問方法/庫(可能是一些ORM庫你創建數據庫對象以及訪問它們?)

就像我說過的,我一直都(並且仍然)在您不得不支持多個數據庫的情況下,對我來說最好的解決方案是爲每個數據庫編寫最佳代碼,而不是試圖找到SQL數據類型和在所有這些數據類型中工作的代碼(我無法達到滿意的程度)。

另外,如果您爲每個數據庫創建單獨的SQL文本,您將能夠從每個數據庫中擠出更多性能(即,在創建完全不適用的Oracle表時,您可以指定的與性能相關的參數在任何其他數據庫中創建一個表)。

我說,不要在不同的數據庫中爭取語法差異,你不會贏。儘可能容忍和利用這些差異來獲得優勢是一個更好的主意。

+0

其實,我是編寫ORM庫的人;) – Christian 2010-11-09 13:59:13

+0

無論如何,這個問題(正如我上面所說的)是數據類型。 SQL語句根據庫進行預處理。我只需要知道核心數據類型。另外,因爲它是通過sql語句傳遞的,所以我不能被多字節打擾(它總是和我傳遞的字符串一樣)。 – Christian 2010-11-09 14:00:43

+0

@Christian,如果你是寫ORM的人,那麼你應該完成繁重的工作。找出自己哪種類型最好。您正在試圖通過查找可以給出所有答案的圖表來削減一個角落。我的觀點是,並不那麼簡單。我關於多字節的觀點並不是你是否需要它,而是關於它是否支持目標數據庫。 – 2010-11-09 14:04:36