Migration
我可以編寫可移植的 SQL 語句嗎?
我想知道是否可以編寫與大多數或所有數據庫 100% 互操作的 SQL 語句,包括:
- MariaDB/MySQL/Percona
- Postgres
- 微軟 SQL
- 甲骨文
- SQLite
(例如,我可以只遵循特定的 SQL 標準嗎?例如,有沒有類似於 SQL 的 POSIX 合規標準的東西?)
如果是這樣,我是否可以在 git post-receive 掛鉤中使用任何可用的 linting 工具來拒絕不遵循此類標准或不符合 SQL 程式碼的 SQL 使用,而無需嘗試在所有數據庫上送出程式碼?
不,無論如何都不是任何重要且實用的程式碼。您可以嘗試遵守標準(例如,使用
COALESCE
而不是ISNULL
),但是有太多的差異,無論大小。在我的頭頂上:
- SQL Server 支持標識符的雙引號和方括號;MySQL 使用反引號。
- SQL Server 支持
TOP
,大多數其他數據庫使用LIMIT
。- PostgreSQL 只是最近才實現的儲存過程,但實際上您可以使用函式來代替。
- MySQL 在 UNIX 上執行時對錶名(但不是欄位名)區分大小寫,但在 Windows 上執行時則不區分大小寫。無論哪種方式,SQL Server 都不區分大小寫(除非是)。
- CTE 和視窗函式並非在所有系統上都可用,並且並不總是以相同的方式實現。
- SQL Server 不需要命令分隔符(除非需要),但 MySQL 和 Oracle 需要。MySQL 在定義儲存過程時還需要使用備用分隔符;MS SQL 不支持任何此類事情。
- 不同供應商的安全性幾乎總是不同的。
- 錯誤處理總是不同的。
- 以上所有內容都可以改變,並且可能自從我上次使用這些系統以來已經改變。
許多人編寫軟體的目的 是讓人們編寫與 RDBMS 無關的查詢。這些實驗中的大多數都失敗了,一些實驗衝出實驗室,在大地上蹣跚而行,在他們的身後蔓延著破壞。但即使是最好的也不會考慮到編寫目標系統的程式碼的性能。