67032


0,1の可変長データ（例：00000001、10000000001）をOracleDBの一つのカラムで管理したい場合のデータ型は何が適切でしょうか？  
現状NUMBER型で設計していたのですが、可変長データを管理できないのではと考えております。  
VARCHAR2で最大ビット数のサイズを確保して管理するのが良いでしょうか。最大ビットサイズは50ビットを想定しています。

プログラムは、C#でOracleは19cになります。


CC BY-SA 4.0
2020-05-26T23:58:59.213
67015
2020-05-30T02:27:02.997
2020-05-27T02:56:33.137
9228
9228
question
c# oracle
0,1の可変長フラグデータを扱う際のDBのデータ型について


  1. '0'と'1'だけを使う10進数として管理する場合  
NUMBER型の最大精度は38のため、50桁の2進数('0'と'1'だけを使う10進数)はNUMBER型で管理できないと思います。  
VARCHAR2を使うことになるでしょう。

  2. INPUTの2進数のデータを10進数に変換して管理する場合  
「領域サイズの面で有利なのは、NUMBERまたはVARCHAR2のどちらなのか」は、モデルを作って実際に計測してみないと、どちらが有利かを言い切れません。  
平均ビット数が小さい場合はVARCHAR2の方が有利な気もしますが、行数が多くないと、有意な差は出て来ないと思います。


CC BY-SA 4.0
2020-05-27T07:52:06.533
67032
2020-05-28T00:10:02.270
2020-05-28T00:10:02.270
35558
35558
67015
answer


DBの型はデータに対してネイティブな型にするのが基本です。

> 0,1の可変長データ（例：00000001、10000000001)

これだけを読むと前置`0`に意味があるデータのように見えますが、そうすると

> 現状NUMBER型で設計

これでは前置`0`が保存されません。

入力データが何か、DB上やそれを読み込むプログラム側でデータがどう扱われるのか、が定義できていないのだと思います。

数値演算(ビット演算含む)が必要なのに文字列型にするとか、数値としては意味が無い前置`0`を扱わないといけないのに数値型にするとかしてしまうと、いちいちキャストするとか、ビット長を別カラムに保存するとか余計な処理が必要になります。


CC BY-SA 4.0
2020-05-30T02:27:02.997
67134
2020-05-30T02:27:02.997
5793
67015
answer