Db2のOracle互換機能を使ってみた😃<7>　～NUMBERタイプの互換性(1)～

#Db2とOracle 数値データ・タイプの違い

当回はデータベース作成後は変更できないDb2のOracle互換機能の中の2つ目、「NUMBERデータ・タイプの互換性」に関して触れたいと思います。
 
##■Oracleの数値データ・タイプ
 
Oracleのマニュアルを見ますと、数値データ・タイプには以下の4種類があるようです。
・NUMBER
・FLOAT
・BINARY_FLOAT
・BINARY_DOUBLE
(参考資料A：Oracle SQL Language Reference 2.1 データ型)
https://docs.oracle.com/cd/E82638_01/sqlrf/Data-Types.html#GUID-F579F4B8-EF13-4CAF-9B06-03B076861C41
 
FLOATはNUMBERのサブタイプということですが、あまり使用されていないらしいのでここでは除かせていただくと、上記の数値型は大きく分けるとNUMBER と、BINARY_FLOAT & BINARY_DOUBLEの2グループに分けることができます。
この2つのグループは内部的な格納方式が異なっており、BINARY_FLOATとBINARY_DOUBLEは2進精度、またNUMBERは10進精度で格納されるという違いがあります。
コンピュータの処理的には内部的に2進精度で格納されている方が処理効率は良いのですが、表現可能な最小値と最大値の間であっても、2進数では正確にはあらわせない数値というものが存在します。
例えば、10進数の0.1は、2進数で表現すると、0.0001100110011……と無限に続きます。
 
一方10進精度の場合、処理効率の観点では2進精度には劣りますが、0および最小値と最大値の間で許容される桁数の制限内であれば、表現できない数値はありません。
ということで、まずNUMBERは10進精度の数値データ･タイプであるということが、大きな特徴になります。

##■Db2の数値データ・タイプ 
Db2のマニュアルを参照しますと、Db2の数値データ・タイプは、整数および10進数、浮動小数点数、そして10進浮動小数点数があり、以下のように分類されるとあります。
(参考資料B: Db2 11.1データ・タイプ・リスト 数値)
https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_11.1.0/com.ibm.db2.luw.sql.ref.doc/doc/r0008469.html
 
  ・厳密な数: 整数および 10 進数
  ・10 進浮動小数点数
  ・近似数: 浮動小数点数
 
Db2もOracle同様、内部的に2進精度のものと10進精度のものに大別できます。
そこでそれぞれに分類される具体的なデータ・タイプは何なのか、ということをまとめてみました。
![Db2数値分類3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528658/283b9fe6-c66e-847a-86d1-0341ca9fe68d.png)

##■Db2におけるNUMBERデータ・タイプの互換性とは
 
上記でご紹介したように、Db2にはNUMBERというデータ・タイプはありません。
Native Db2でデータ・タイプにNUMBERと指定して定義すると、エラーになります。
そこで、NUMBERというデータ・タイプの指定ができるようにするための機能が、Oracle互換機能の「NUMBERデータ・タイプの互換性」ということになります。
 
しかしこれはOracle互換のDb2のシステムで、新たにOracleと同じNUMBERというデータ・タイプが提供されるということではありません。
飽くまでも、NUMBERの指定をいずれかの既存のDb2の数値データ・タイプに置き換えてくれるということに過ぎないのです。
OracleでもANSI SQL型との互換性のため、INTEGERなどのデータ・タイプの指定ができるようになっていますが、これも内部的には相当するNUMBERの定義に置き換えているだけで、Db2でのNUMBER指定もそれと似たものと言えます。

##■NUMBERとDb2の数値データ・タイプとのマッピング 
では、NUMBERはDb2のどのタイプと互換性があるのかということですが、NUMBERは10進精度のデータ・タイプであることを最初にご紹介しましたが、これがキーポイントとなります。
 
Db2で10進精度の数値データ・タイプは上の図のオレンジの点線枠で囲った
・DECIMAL または NUMERIC  (NUMERICはDECIMALの同義語です）
・DECFLOAT(16)
・DECFLOAT(34)
の3種であり、NUMBERは精度と位取りの指定の仕方によって、次のようにマッピングされます。

**NUMBERのマッピング**
![NUMBERマッピング_カッコ数字なし.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528658/0f24b461-b0ac-e34d-8768-55307dab7ba2.png)


つまり、精度と位取りの指定があれば、基本的には同じ精度と位取り指定のDECIMALにマッピングされるということです。
ただし、細かい点においては、いろいろ考慮すべき事項もあります。
次回以降はこの考慮すべき事項に関して、ご紹介していきたいと思います。
 
つづく

##関連投稿
[・Db2のOracle互換機能を使ってみた😃<1>　～データベースの作成～][1]
[1]:https://qiita.com/Seven_Marine/items/1a9009a29e78fc80a2f0
[・Db2のOracle互換機能を使ってみた😃<2>　～可変長列の末尾ブランクの違い～][2] 
[2]:https://qiita.com/Seven_Marine/items/f7a31fc71a728282e043
[・Db2のOracle互換機能を使ってみた😃<3>　～空文字(長さ0の文字)の扱い(1)～][3]
[3]:https://qiita.com/Seven_Marine/items/470d58226fe89f017b2a
[・Db2のOracle互換機能を使ってみた😃<4>　～空文字(長さ0の文字)の扱い(2)～][4] 
[4]:https://qiita.com/Seven_Marine/items/612e1ca67054337f9758
[・Db2のOracle互換機能を使ってみた😃<5>　～空文字(長さ0の文字)の扱い(3)～][5] 
[5]:https://qiita.com/Seven_Marine/items/28c73c824619baf48354
[・Db2のOracle互換機能を使ってみた😃<6>　～空文字(長さ0の文字)の扱い(4)～][6] 
[6]:https://qiita.com/Seven_Marine/items/5cc1afad26ea4eea4644
[・Db2のOracle互換機能を使ってみた😃<8>　～NUMBERタイプの互換性(2)～][8]
[8]:https://qiita.com/Seven_Marine/items/a9b2c0e8a03695ef82c1
[・Db2のOracle互換機能を使ってみた😃<9>　～NUMBERタイプの互換性(3)～][9]
[9]:https://qiita.com/Seven_Marine/items/6a47ea5ea6418c6db6e2
[・Db2のOracle互換機能を使ってみた😃<10>　～NUMBERタイプの互換性(4)～][10] 
[10]:https://qiita.com/Seven_Marine/items/b260192afc9ec5c60899

-----
お断り：
当投稿は、Database migration to DB2-IBM Japan Community Wikiに掲載のブログを、Qiita用に書き直したものです。

本資料掲載事項は、ある特定の環境・使用状況においての正確性は確認されていますが、すべての環境において同様の結果が得られる保証はありません。
これらの技術を自身の環境に適用する際には、自己の責任において十分な検証と確認を実施いただくことをお奨めいたします。