動的SQLを使用しない方法
text
には16進数からのキャストはありません 数値型への表現ですが、bit(n)
を使用できます ウェイポイントとして。 文書化されていない ビット文字列からのキャスト(bit(n)
)から整数型(int2
、int4
、int8
)-内部表現はバイナリ互換です。トムレーンの引用:
これは、ビットタイプの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フィールドに最適なデータ型は何ですか?