「應該支援」≠「確實支援」。為了應用程式可在 Oracle、SQL Server、MySQL、PostgreSQL 間移植,必須以 ANSI SQL-92 為基準線,避開專有語法。
(+) 外連接 vs ANSI LEFT JOIN。CROSS JOIN、NATURAL JOIN 優化路徑不同。INNER JOIN/LEFT JOIN,必要時在應用層組合資料。-- 安全清單
CREATE TABLE, DROP TABLE
INSERT, UPDATE, DELETE, SELECT
ALTER TABLE (ADD COLUMN, DROP COLUMN 僅基本型別)
識別碼含保留字、空格、特殊字元 → 全程雙引號 \"My Table\"(ANSI)或反引號 \`my_table\`(MySQL)。
| ✅ 通用安全型別 | ❌ 避免使用 |
|---|---|
| INTEGER, SMALLINT, BIGINT | SERIAL, AUTO_INCREMENT, IDENTITY |
| NUMERIC(p,s), DECIMAL(p,s) | MONEY, SMALLMONEY |
| REAL, DOUBLE PRECISION, FLOAT | BINARY_FLOAT, BINARY_DOUBLE |
| VARCHAR(n), CHAR(n) | TEXT, NTEXT, CLOB, BLOB (改用檔案儲存) |
| DATE, TIMESTAMP | DATETIME (MySQL), SMALLDATETIME |
| BOOLEAN / BIT | BIT(1) 在各平台行為不一 |
CREATE TABLE parent (
id INTEGER PRIMARY KEY,
name VARCHAR(100)
);
CREATE TABLE child (
id INTEGER PRIMARY KEY,
parent_id INTEGER REFERENCES parent(id)
);
SQLGetInfo(dbc, SQL_DBMS_NAME) 動態調整 SQL 方言(如分頁語法)。跨平台不代表「零成本」,而是「可控成本」。堅守 ANSI SQL-92 核心集、封裝方言差異於資料存取層、完善整合測試,才是長久之計。