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

Hvad er reglen for "ukendt" og typeslutning?

Der er faktisk tre spørgsmål derinde, som jeg vil forsøge at besvare.

  1. Hvad er formålet med unknown ?

    Dette er den datatype, der oprindeligt blev tildelt NULL'er og strengliteraler i SQL-sætninger. Hvis sådanne bogstaver blev tildelt, skriv text umiddelbart ville det være svært at udlede den korrekte type.

    For eksempel vil du have myfunc('hello') at påkalde myfunc(character varying) , men der er ingen implicit type cast fra text til character varying (og det ville forårsage tvetydighed, hvis du oprettede en).

  2. Hvorfor er SELECT null returnere en kolonne af typen unknown ?

    Det traditionelle svar er:Fordi brugeren ikke har angivet typen.

    Denne adfærd har dog været problematisk. For eksempel, hvis du opretter en tabel som denne:

    CREATE TABLE test
       AS SELECT 'hello';
    

    du ville ende med en kolonne af typen unknown , hvilket er uønsket og vil give problemer længere fremme. Typen unknown burde egentlig ikke være brugersynlig, men snarere en implementeringsdetalje.

    Derfor er this commit har ændret adfærden fra PostgreSQL v10 på:Nu enhver unknown er tilbage i en SELECT eller RETURNING liste tvinges til at text , og tabeller kan ikke oprettes med kolonner af typen unknown .

  3. Hvorfor vælger SELECT NULL UNION SELECT 42 virker, men ikke SELECT NULL UNION SELECT NULL UNION SELECT 42 ?

    Dette skyldes typekonverteringsreglerne .UNION efterlades associativ, så sidstnævnte forespørgsel tolkes som

    (SELECT NULL UNION SELECT NULL) UNION SELECT 42;
    

    Nu den første UNION løses til datatypen text på grund af regel 3:

    Dette forårsager en fejl, når du forsøger at løse typen for den anden UNION på grund af regel 4:

    På den anden side i forespørgslen

    SELECT NULL UNION SELECT 42;
    

    "NULL" har typen unknown , og "42" har typen integer (den valgte type for numeriske bogstaver uden decimaltegn).

    Regel 5

    gælder ikke her, fordi integer er ikke en foretrukken type i sin kategori (det ville være oid og double precision ), så regel 6 bruges:

    Dette resulterer i en type integer .




  1. Tjek om brugeren er på siden

  2. Hvorfor er InnoDB-tabelstørrelsen meget større end forventet?

  3. RoR Postgresql tidszonegruppe ved ikke at arbejde på Heroku

  4. Hvordan får man ugedagsnavnet fra en dato?