Warum hat information_schema Zeichenfolgen "YES" und "NO" anstelle von Booleschen Werten?

7

Ich war überrascht zu finden , dass die is_nullableSpalte für diese Abfrage als typisiert ist , character varying (3)statt boolean:

select
    column_name,
    data_type,
    is_nullable
from
    information_schema.columns
where
    table_schema = 'public';

Ich habe festgestellt, dass in einigen anderen Spalten auch "JA" / "NEIN" verwendet wird. Was ist der Grund dafür? Mein erster Gedanke war, dass vielleicht andere Werte als "JA" und "NEIN" möglich sind, was etwas anderes als a rechtfertigt boolean, aber ich habe in meiner aktuellen Datenbank keine Beispiele dafür gesehen.

Devuxer
quelle

Antworten:

12

INFORMATION_SCHEMA

Mit psql können Sie das Schema mit anzeigen \d information_schema.columnsoder es in den Dokumenten nachschlagen .

                               View "information_schema.columns"
          Column          |                Type                | Collation | Nullable | Default 
--------------------------+------------------------------------+-----------+----------+---------
... stuff cropped..
 is_nullable              | information_schema.yes_or_no       |           |          | 

SQL Spec

Wenn information_schema.columns.is_nullablewir in der Spezifikation nachschlagen, können wir sehen, dass es die Schuld der Spezifikation ist - wie es oft bei Sachen der Fall ist. Sie können nicht einfach 9.000 Jahre Vermächtnis löschen. Besonders mit etwas, das eine zuverlässige Schnittstelle bieten soll. Aus der SQL 2011-Spezifikation

IS_NULLABLE INFORMATION_SCHEMA.YES_OR_NO
  CONSTRAINT COLUMNS_IS_NULLABLE_NOT_NULL NOT NULL,

Und Sie können die Definition von INFORMATION_SCHEMA.YES_OR_NOdefiniert auch in der Spezifikation sehen,

CREATE DOMAIN YES_OR_NO AS
  CHARACTER VARYING (3)
  CHARACTER SET SQL_IDENTIFIER
    CONSTRAINT YES_OR_NO_CHECK
    CHECK (VALUE IN ( 'YES', 'NO' ) );

GRANT USAGE ON DOMAIN YES_OR_NO
  TO PUBLIC WITH GRANT OPTION;

Der RDBM-spezifische Katalog von PostgreSQL

Wenn Sie die generische standardisierte Schnittstelle jedoch nicht benötigen, finden Sie in der Regel etwas Vernünftigeres pg_catalog. In diesem Fall möchten Sie pg_catalog.pg_attribute. Lass es uns überprüfen \d pg_catalog.pg_attribute,

              Table "pg_catalog.pg_attribute"
    Column     |   Type    | Collation | Nullable | Default 
---------------+-----------+-----------+----------+---------
 attnotnull    | boolean   |           | not null | 

Da ist dein Boolescher Wert.

PostgreSQL-Dokumente

In den PostgreSQL-Dokumenten zum Informationsschema: Datentypen wird dies auch tatsächlich behandelt.

Eine Zeichenfolgendomäne, die entweder JA oder NEIN enthält . Dies wird verwendet, um boolesche (wahr / falsch) Daten im Informationsschema darzustellen. (Das Informationsschema wurde erfunden, bevor der Typ booleanzum SQL-Standard hinzugefügt wurde. Diese Konvention ist daher erforderlich, um das Informationsschema abwärtskompatibel zu halten.)

Evan Carroll
quelle