Måder uden dynamisk SQL
Der er ingen cast fra hex-numre i tekst
repræsentation til en numerisk type, men vi kan bruge bit(n)
som et vejpunkt. Der er udokumenterede casts fra bitstrenge (bit(n)
) til heltalstyper (int2
, int4
, int8
) - den interne repræsentation er binær kompatibel. Citerer Tom Lane:
Dette er afhængigt af noget udokumenteret opførsel af bit-type inputkonverteren, men jeg ser ingen grund til at forvente, at det ville gå i stykker. Et muligvis større problem er, at det kræver PG>=8.3, da der ikke var en tekst-til-bit cast før det.
heltal
for max. 8 hex-cifre
Op til 8 hex-cifre kan konverteres til bit(32)
og derefter tvunget til heltal
(standard 4-byte heltal):
VÆLG ('x' || lpad(hex, 8, '0'))::bit(32)::int AS int_valFROM ( VALUES ('1'::text) , ('f') , ('100') , ('7ffffffff'), ('80000000') -- overløb i negativt tal , ('deadbeef') , ( 'ffffffff'), ('ffffffff123') -- for lang ) AS t(hex);
int_val------------ 1 15 256 2147483647-2147483648 -559038737 -1
Postgres bruger en heltalstype med fortegn, så hex-numre over '7fffffff'
overløb til negativt heltal tal. Dette er stadig en gyldig, unik repræsentation, men betydningen er anderledes. Hvis det betyder noget, skal du skifte til bigint
; se nedenfor.
For mere end 8 hex-cifre bliver de mindst signifikante tegn (overskydende til højre) trunkeret .
4 bit i en bitstreng kode 1 hex-cifre . Hex-numre af kendt længde kan støbes til den respektive bit(n)
direkte. Alternativt kan du indsætte hex-numre med ukendt længde med foranstillede nuller (0
) som vist og cast til bit(32)
. Eksempel med 7 hex-cifre og int
eller 8 cifre og bigint
:
SELECT ('x'|| 'deafbee')::bit(28)::int , ('x'|| 'deadbeef')::bit(32)::bigint;
int4 | int8------------+------------ 233503726 | 3735928559
bigt
for max. 16 hex-cifre
Op til 16 hex-cifre kan konverteres til bit(64)
og derefter tvunget til bigint
(int8
, 8-byte heltal) - flyder over i negative tal i den øverste halvdel igen:
VÆLG ('x' || lpad(hex, 16, '0'))::bit(64)::bigint AS int8_valFROM ( VALUES ('ff'::text) , ('7fffffff') , ('80000000'), ('deadbeef'), ('7ffffffffffffffff') , ('80000000000000000') -- (overløb i negativt tal 'ffffffffffffffff'), ('ffffffffffffffff123') -- for lang ) t(hex);
int8_val--------------------- 255 2147483647 2147483648 3735928559 9223372036854775807-92233720368547715808 -1 -1 -1
uuid
for max. 32 hex-cifre
Postgres uuid
datatypen er ikke en numerisk type . Men det er den mest effektive type i standard Postgres at gemme op til 32 hex-cifre, der kun optager 16 bytes lagerplads. Der er en direkte medvirkende fra tekst
til uuid
(intet behov for bit(n)
som waypoint), men præcis Der kræves 32 hex-cifre.
VÆLG lpad(hex, 32, '0')::uuid AS uuid_valFROM ( VALUES ('ff'::text) , ('deadbeef') , ('ffffffffffffffff'), ('ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff123') -- for lang );)code
uuid_val-------------------------------------- 00000000-0000-0000 -0000-0000000000FF 00000000-0000-0000-0000-0000DEADBEEF 00000000-0000-0000-FFFFF-FFFFFFFFFFFFFF-FFFFFFFFFF-FFFFF-FFFF-FFFFFFFFFFFFFFFFFFFFFFFF-FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF overfffffffff-fffffFff
Som du kan se, er standardoutput en streng af hex-cifre med typiske separatorer for UUID.
md5 hash
Dette er især nyttigt til at gemme md5 hashes :
SELECT md5('Gem hash for lang streng, måske for indeks?')::uuid AS md5_hash;
md5_hash--------------------------------------------- 02e10e94-e895-616e -8e23-bb7f8025da42
Se:
- Hvad er den optimale datatype for et MD5-felt?