sql >> Database teknologi >  >> RDS >> PostgreSQL

Konverter hex i tekstrepræsentation til decimaltal

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 ); 
 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?


  1. Sådan importeres og eksporteres en database via SSH

  2. Ansible elsker PostgreSQL

  3. 3 måder at få månedsnavnet fra en dato i SQL Server (T-SQL)

  4. Tips til fjernstyring af PostgreSQL