Migration

我可以編寫可移植的 SQL 語句嗎?

  • January 20, 2020

我想知道是否可以編寫與大多數或所有數據庫 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 無​​關的查詢。這些實驗中的大多數都失敗了,一些實驗衝出實驗室,在大地上蹣跚而行,在他們的身後蔓延著破壞。但即使是最好的也不會考慮到編寫目標系統的程式碼的性能。

引用自:https://dba.stackexchange.com/questions/257305