sql >> データベース >  >> RDS >> Oracle

NULL列(0,3)による数値オーバーフロー

    列の値がnullではなく、破損しています。数値に使用される内部表現は、ドキュメントに記載 、または他のさまざまな場所このように

    最初のバイトは指数であり、ゼロにすることができますが、その後に3が続くだけではありません。あなたが得ることができると思う最も近いものは0,3,102 -9.8 * x10^125の場合

    ドキュメントから

    それでは、極端な端のいくつかがどのように保存されているかを見てみましょう:

    with t (n) as (
                select  1 * power(10, -130) from dual
      union all select  1 * power(10, 125) from dual
      union all select -1 * power(10, -130) from dual
      union all select -1 * power(10, 125) from dual
      union all select -9.7 * power(10, 125) from dual
      union all select -9.8 * power(10, 125) from dual
      union all select -9.85 * power(10, 125) from dual
      union all select -9.9 * power(10, 125) from dual
    )
    select n, dump(n) d1, dump(n, 1016) d2 from t
    
              N D1                             D2
    ----------- ------------------------------ ------------------------------
     1.000E-130 Typ=2 Len=2: 128,2             Typ=2 Len=2: 80,2
     1.000E+125 Typ=2 Len=2: 255,11            Typ=2 Len=2: ff,b
    -1.000E-130 Typ=2 Len=3: 127,100,102       Typ=2 Len=3: 7f,64,66
    -1.000E+125 Typ=2 Len=3: 0,91,102          Typ=2 Len=3: 0,5b,66
    -9.700E+125 Typ=2 Len=3: 0,4,102           Typ=2 Len=3: 0,4,66
    -9.800E+125 Typ=2 Len=3: 0,3,102           Typ=2 Len=3: 0,3,66
    -9.850E+125 Typ=2 Len=4: 0,3,51,102        Typ=2 Len=4: 0,3,33,66
    -9.900E+125 Typ=2 Len=3: 0,2,102           Typ=2 Len=3: 0,2,66
    
    select  1 * power(10, 126) from dual;
    
    ORA-01426: numeric overflow
    

    ダンプされた0,3の値 末尾に負の数を示す102はありませんが、正の場合、最初のバイトは少なくとも128になります。

    OCIプログラムが番号を誤って処理したり、レガシーインポートでさえ同じことを行ったりすることで、番号が破損する場合があります。データが最初にどのように作成されたかを知らなければ、何がうまくいかなかったのか、いつ、または値が元々想定されていたのかを正確に知ることはおそらくできないでしょう。

    SQL Developerが結果グリッドにnullを表示するのは奇妙です(スクリプトとしてクエリを実行すると中止されるようです)。 SQL * Plusでは、set nullを設定しても値は表示されません 固定文字列に。 SQL DeveloperまたはJDBCドライバーは、内部表現から変換できないことを黙って飲み込んでいる可能性があります。




    1. SqliteまたはMySql?決める方法は?

    2. Postgresqlの日付形式

    3. MySql Doctrine:指定された変数がIN配列プロパティであるかどうかを確認します

    4. 複数のテーブル、複数のGROUP BYおよびgroup_concatからのMySQLSELECT?