web-dev-qa-db-ja.com

データベース:普遍的なデータ型はありますか?

(Enterprise Architectなどのツールを使用して)データベーステーブルを設計するときに、将来別のデータベースに切り替える必要がある場合に、すべてのデータベースで機能する「ユニバーサル」データ型のみを使用するにはどうすればよいですか?切り替え中、新しいデータベースで利用できない列のデータ型を、新しいデータベースで利用できる適切なデータ型に変更しないようにしたいと思います。

つまり、すべてのデータベースで同じサイズで機能するANSIデータ型はありますか?つまり、「ANSI SQL」と同様に、「ANSI SQLデータ型」のようなものはありますか?

4

最も基本的なデータ型の場合、ほぼすべてのDBMSがANSIデータ型を直接サポートするか、少なくともそれらを指定できます。

次のステートメント:

create table products
(
   product_id    integer not null primary key,
   product_name  varchar(100),
   price         decimal(10,2)
);

ほぼすべてのDBMSで動作します。ただし、データタイプはDBMS固有のデータタイプに変換されます(たとえば、integerはOracleではnumberに、またはvarcharvarchar2に変更されます)。

CLOB、BLOB、XML、Json、または地理空間タイプなどの「高度な」データ型については、これは当てはまりません(CLOB、BLOBはかなり一般的ですが、たとえばPostgresでは理解できませんが、より互換性を持たせるために、その名前のドメインまたはユーザーデータ型)。

ANSI規格で定義されている基本的なデータ型は次のとおりです。

  • キャラクター
  • CHARACTER VARYING(またはVARCHAR)
  • キャラクター大オブジェクト
  • NCHAR
  • NCHAR VARYING
  • バイナリ
  • バイナリ変化
  • バイナリラージオブジェクト
  • NUMERIC
  • 10進数
  • 小さな
  • 整数
  • 大きな
  • FLOAT
  • リアル
  • 倍精度
  • ブール
  • 日付
  • 時間
  • タイムスタンプ
  • 間隔

すべてのDBMSがそれらすべてをサポートするわけではありません(MySQLには間隔データ型がありません。MySQLとSQL Serverにはrealブール型がありません。Oracleブール型をまったく持たないか、実際のDATEまたはTIMEデータ型を持たない。Postgresにはncharがありません-リストは何度も続く可能性があります)。しかし、最も一般的なものは通常非常にうまく機能します。

私の経験から、次のものは異なるDBMS全体で(大きな)問題なしに機能します(ただし、my経験-これは完全または明確なリストではありません!)

  • VARCHAR
  • 整数
  • 10進数
  • 日付(サプライズあり:Oracleにはありますが、時間が含まれています)
  • TIMESTAMP(SQL ServerおよびMySQLで予想されるものとは異なる処理を行います)

これらに固執する場合、あなたはかなり「普遍的」ですが、DBMS間を移動するとき、何か他のものは(不快な)驚きを与えます。

Oracleは奇数である傾向があり、「NUMBER」はビット、ショート、整数、ロング、10進数、および浮動小数点をカバーします。また、大きなテキストにはCLOBとNCLOBを使用し、SQL Serverで使用されるIMAGEの代わりにBLOBを使用します。

0
Cylon Cat