RDBMS製品ごとの特徴的な差異をまとめた資料とかないんだろうか?たとえば以下。
# | 項目 | Oracle | SQL Server | PostgreSQL | MySQL | HiRDB |
---|---|---|---|---|---|---|
1 | 空文字列とNULLの区別 | 区別しない | 区別する | 区別する | 区別する | 区別する |
2 | DDLがロールバックできるか(トランザクションになるか) | できない | できる | できる | できない | ? |
3 | ロックモードの種別 | 5種類 | 22種類 | 8種類 | 4種類 | 2種類 |
4 | SQL単位でのダーティーリード設定 | 不可能 | 可能 | 不可能 | 不可能 | 可能 |
5 | トランザクション単位でのダーティーリード設定 | 不可能 | 可能 | 不可能 | 可能 | 不可能 |
6 | SKIP LOCKED | ある | ある | ある | ある | ない |
7 | IS NULL検索でindexを使う | 場合による | 使う | 使う | 使う | 使う |
8 | JDBCドライバのライセンス | 商用 | MIT | BSD | GPLv2 | 商用 |
9 | 実行計画の更新 | 自動更新 | 自動更新 | 自動更新 | 自動更新 | 手動更新 |
10 | ロックエスカレーション | なし | あり | なし | なし | なし |
11 | XQuery | 使用可能 | 使用可能 | XPathのみ | XPathのみ | 使用可能 |
12 | INSERTのVALUESが列数より少ない時の挙動 | エラー | エラー | 正常終了 | エラー | ? |
13 | 無効なコードポイント(例:U+FFFF)をINSERT | 正常終了 | 正常終了 | エラー | エラー | ? |
14 | hint文の識別子のcase sensitivity | 区別しない | 設定による? | 区別する | 設定による | ? |
15 | 同時実行制御方式 | MVCC | ロック | MVCC | MVCC | ロック |
ロックモードの種別数はちょっと自信がないんだけど、以下のような資料を参考にした。
- Oracle: https://docs.oracle.com/cd/E16338_01/server.112/b56299/ap_locks001.htm
- SQL Server: https://learn.microsoft.com/ja-jp/sql/relational-databases/sql-server-transaction-locking-and-row-versioning-guide?view=sql-server-ver16#lock-granularity-and-hierarchies
- PostgreSQL: https://www.postgresql.jp/document/9.6/html/explicit-locking.html
- MySQL: https://dev.mysql.com/doc/refman/8.0/ja/innodb-locking.html
- HiRDB: https://itpfdoc.hitachi.co.jp/manuals/3020/3020656170/W5610321.HTM
XQueryに関するURLは以下。
- Oracle: https://docs.oracle.com/cd/E82638_01/adxdb/xquery-and-XML-DB.html#GUID-4F83A835-C94B-4D62-999B-111AB5E8A8F1
- SQL Server: https://learn.microsoft.com/ja-jp/sql/xquery/general-xquery-use-cases?view=sql-server-ver16
- PostgreSQL: https://www.postgresql.jp/document/12/html/xml-limits-conformance.html
- MySQL: https://dev.mysql.com/doc/refman/8.0/ja/xml-functions.html
- HiRDB: https://itpfdoc.hitachi.co.jp/manuals/3020/3020635743/W3570074.HTM
「INSERTのVALUESが列数より少ない時の挙動」については以下を参照。
えええっ!? PostgreSQLってこれOKなの...。驚いた。エラーにしてほしい。。
— 坂井 恵(SAKAI Kei) (@sakaik) 2024年4月5日
-----
CREATE TABLE t1 (a int, b int, c int);
INSERT INTO t1 VALUES(4,5);