Da sind eigentlich drei Fragen drin, die ich versuchen werde zu beantworten.
-
Was ist der Zweck von
unknown
?Dies ist der Datentyp, der ursprünglich NULL-Werten und Zeichenfolgenliteralen in SQL-Anweisungen zugewiesen wurde. Wenn solche Literale zugewiesen wurden, geben Sie
text
ein sofort wäre es schwierig, auf den richtigen Typ zu schließen.Zum Beispiel möchten Sie
myfunc('hello')
ummyfunc(character varying)
aufzurufen , aber es gibt keine implizite Typumwandlung vontext
zucharacter varying
(und es würde Unklarheiten verursachen, wenn Sie eine erstellen). -
Warum ist
SELECT null
gibt eine Spalte vom Typunknown
zurück ?Die traditionelle Antwort lautet:Weil der Benutzer den Typ nicht angegeben hat.
Dieses Verhalten war jedoch problematisch. Wenn Sie beispielsweise eine Tabelle wie diese erstellen:
CREATE TABLE test AS SELECT 'hello';
Sie würden am Ende eine Spalte vom Typ
unknown
erhalten , was unerwünscht ist und später zu Problemen führen wird. Der Typunknown
sollte wirklich nicht für den Benutzer sichtbar sein, sondern eher ein Implementierungsdetail.Folglich dieses Commit hat das Verhalten ab PostgreSQL v10 geändert:Jetzt jeder
unknown
s links in einemSELECT
oderRETURNING
list werden zutext
gezwungen , und Tabellen können nicht mit Spalten des Typsunknown
erstellt werden . -
Warum
SELECT NULL UNION SELECT 42
funktionieren, aber nichtSELECT NULL UNION SELECT NULL UNION SELECT 42
?Dies ist den Typkonvertierungsregeln geschuldet .
interpretiertUNION
bleibt assoziativ, daher wird letztere Abfrage als(SELECT NULL UNION SELECT NULL) UNION SELECT 42;
Nun die erste
UNION
wird in den Datentyptext
aufgelöst wegen Regel 3:Dies verursacht einen Fehler beim Versuch, den Typ für die zweite
UNION
aufzulösen wegen Regel 4:Andererseits in der Abfrage
SELECT NULL UNION SELECT 42;
„NULL“ hat den Typ
unknown
, und „42“ hat den Typinteger
(der für numerische Literale ohne Dezimalpunkt gewählte Typ).Regel 5
trifft hier nicht zu, weil
integer
ist kein bevorzugter Typ in seiner Kategorie (das wäreoid
unddouble precision
), also wird Regel 6 verwendet:Dies ergibt eine Art
integer
.