複数データベースに対応したシステムを作ってるとよくわからなくなるのでメモ。
こういう話題だとなにかと Oracle が ANSI標準に沿わないと槍玉にあがるが、MySQLの方が意外と鬼っ子だったりする。
Oracle Database
- 英字で始まる 英数(A-Z0-9)、アンダースコア(_)、ドル($)、シャープ(#)からなる文字列
- 30バイト以内
- 大文字/小文字の区別なし(大文字に正規化)
- ダブルクォート("識別子")にてエスケープ可能
DB2
- 英字で始まる 英数(A-Z0-9)、アンダースコア(_)からなる文字列
- 128バイト以内
- 大文字/小文字の区別なし(大文字に正規化)
- ダブルクォート("識別子")にてエスケープ可能
SQL Server
- 英字で始まる 英数(A-Z0-9)、アンダースコア(_)、アットマーク(@)、シャープ(#)からなる文字列
- 128バイト以内
- 大文字/小文字の区別はデータベースの照合順序次第
- ダブルクォート("識別子")、角括弧([識別子])にてエスケープ可能
MySQL
- 英数で始まる 英数(A-Z0-9)、アンダースコア(_)、ドル($)からなる文字列
- 64バイト以内
- 大文字/小文字の区別なし(ただし、一部の環境では混在不可)
- バッククォート(`識別子`)にてエスケープ可能、後者は ANSI_QUOTES 有効時はダブルクォート("識別子") も可
PostgreSQL
- 英字あるいはアンダースコアで始まる英数(A-Z0-9)、アンダースコア(_)、ドル($)からなる文字列
- 64バイト以内(設定で変更可)
- 大文字/小文字の区別なし(小文字に正規化)
- ダブルクォート("識別子")、ユニコードクォート(U&"識\5225+005B50")にてエスケープ可能
H2 Database
- 英字あるいはアンダースコアで始まる英数(A-Z0-9)、アンダースコア(_)からなる文字列
- 長さの制限なし
- 大文字/小文字の区別なし
- ダブルクォート("識別子")にてエスケープ可能
sqlite
- 英字あるいはアンダースコアで始まる英数(A-Z0-9)、アンダースコア(_)からなる文字列
- 長さの制限なし
- 大文字/小文字の区別なし
- ダブルクォート("識別子")、バッククォート(`識別子`)、角括弧([識別子])にてエスケープ可能