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

テキスト表現の16進数を10進数に変換します

    動的SQLを使用しない方法

    textには16進数からのキャストはありません 数値型への表現ですが、bit(n)を使用できます ウェイポイントとして。 文書化されていない ビット文字列からのキャスト(bit(n) )から整数型(int2int4int8 )-内部表現はバイナリ互換です。トムレーンの引用:

    これは、ビットタイプのinputconverterの文書化されていない動作に依存していますが、それが機能しなくなると予想する理由はありません。おそらくより大きな問題は、その前にテキストビットがキャストされていなかったため、PG>=8.3が必要になることです。

    integer 最大の場合8桁の16進数

    最大8桁の16進数をbit(32)に変換できます その後、integerに強制されます (標準の4バイト整数):

    SELECT ('x' || lpad(hex, 8, '0'))::bit(32)::int AS int_val
    FROM  (
       VALUES
          ('1'::text)
        , ('f')
        , ('100')
        , ('7fffffff')
        , ('80000000')     -- overflow into negative number
        , ('deadbeef')
        , ('ffffffff')
        , ('ffffffff123')  -- too long
       ) AS t(hex);
       int_val
    ------------
              1
             15
            256
     2147483647
    -2147483648
     -559038737
             -1
    

    Postgresは符号付き整数型を使用するため、 '7fffffff'より上の16進数 負の整数にオーバーフローします 数字。これはまだ有効で一意の表現ですが、意味 異なります。それが重要な場合は、bigintに切り替えてください;以下を参照してください。

    16進数が8桁を超える場合、最下位文字(右側に過剰)は切り捨てられます

    4ビット ビット文字列で1桁の16進数をエンコードします 。既知の長さの16進数は、それぞれのbit(n)にキャストできます。 直接。または、不明な長さの16進数を埋め込みます 先行ゼロ付き(0 )デモンストレーションされ、bit(32)にキャストされます 。 7桁の16進数とintの例 または8桁とbigint

    SELECT ('x'|| 'deafbee')::bit(28)::int
         , ('x'|| 'deadbeef')::bit(32)::bigint;
    
      int4     | int8
    -----------+------------
     233503726 | 3735928559
    

    bigint 最大の場合16進数の16進数

    最大16桁の16進数をbit(64)に変換できます その後、 bigintに強制されました int8 、8バイト整数)-上半分で再び負の数にオーバーフローします:

    SELECT ('x' || lpad(hex, 16, '0'))::bit(64)::bigint AS int8_val
    FROM  (
       VALUES
          ('ff'::text)
        , ('7fffffff')
        , ('80000000')
        , ('deadbeef')
        , ('7fffffffffffffff')
        , ('8000000000000000')     -- overflow into negative number
        , ('ffffffffffffffff')
        , ('ffffffffffffffff123')  -- too long
       ) t(hex);
           int8_val
    ---------------------
                     255
              2147483647
              2147483648
              3735928559
     9223372036854775807
    -9223372036854775808
                      -1
                      -1
    

    uuid 最大の場合32桁の16進数

    Postgres uuid データ型は数値型ではありません 。ただし、最大32桁の16進数を格納し、16バイトのストレージしか占有しない、標準のPostgresで最も効率的なタイプです。 直接キャストがあります textから uuidへ (bit(n)は必要ありません ウェイポイントとして)、ただし正確に 32桁の16進数が必要です。

    SELECT lpad(hex, 32, '0')::uuid AS uuid_val
    FROM  (
       VALUES ('ff'::text)
            , ('deadbeef')
            , ('ffffffffffffffff')
            , ('ffffffffffffffffffffffffffffffff')
            , ('ffffffffffffffffffffffffffffffff123') -- too long
       ) t(hex);
                  uuid_val
    --------------------------------------
     00000000-0000-0000-0000-0000000000ff
     00000000-0000-0000-0000-0000deadbeef
     00000000-0000-0000-ffff-ffffffffffff
     ffffffff-ffff-ffff-ffff-ffffffffffff
     ffffffff-ffff-ffff-ffff-ffffffffffff
    

    ご覧のとおり、標準出力は、UUIDの一般的な区切り文字を含む16進数の文字列です。

    md5ハッシュ

    これは、md5ハッシュを保存する場合に特に便利です。 :

    SELECT md5('Store hash for long string, maybe for index?')::uuid AS md5_hash;
    
               md5_hash
    --------------------------------------
     02e10e94-e895-616e-8e23-bb7f8025da42
    

    参照:

    • MD5フィールドに最適なデータ型は何ですか?


    1. foreach%dopar%+ RPostgreSQL

    2. SortCL互換のIRIジョブでのテーブルルックアップ

    3. postgresqlでNOTINが機能しない

    4. クエリ中にMySQLサーバーへの接続が失われました