web-dev-qa-db-ja.com

information_schemaにブール値ではなく「YES」と「NO」の文字列があるのはなぜですか?

驚いたことに、このクエリの_is_nullable_列がbooleanではなくcharacter varying (3)として入力されていることがわかりました。

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

他の列でも「はい」/「いいえ」を使用していることに気づきました。これの理由は何ですか?私の当初の考えでは、「[はい]」と「[いいえ]」以外の値も可能であり、boolean以外の値を正当化できると思いましたが、現在のデータベースではこれの例を確認できませんでした。

7
devuxer

INFORMATION_SCHEMA

Psqlを使用すると、\d information_schema.columnsを使用してスキーマを表示できます。または、 ドキュメントで検索 を使用してスキーマを表示できます。

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

SQL仕様

仕様でinformation_schema.columns.is_nullableを検索すると、仕様の誤りであることがわかります。 9,000年分の遺産を消すことはできません。特に、信頼できるインターフェースを提供することになっているもので。 SQL 2011仕様から、

IS_NULLABLE INFORMATION_SCHEMA.YES_OR_NO
  CONSTRAINT COLUMNS_IS_NULLABLE_NOT_NULL NOT NULL,

仕様で定義されているINFORMATION_SCHEMA.YES_OR_NOの定義も確認できます。

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;

PostgreSQLのRDBM固有のカタログ

ただし、汎用の標準化されたインターフェイスが必要ない場合は、通常、 pg_catalog でより健全なものを見つけることができます。この場合、必要なのは pg_catalog.pg_attribute です。 \d pg_catalog.pg_attributeをチェックしてみましょう。

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

あなたのブールがあります。

PostgreSQLドキュメント

情報スキーマに関するPostgreSQLのドキュメント:データ型 実際にこれにも対処します、

[〜#〜] yes [〜#〜]または[〜#〜のいずれかを含む文字列ドメイン]いいえ[〜#〜]。これは、情報スキーマでブール(true/false)データを表すために使用されます。 (タイプbooleanがSQL標準に追加される前に情報スキーマが発明されたため、情報スキーマの下位互換性を維持するためにこの規約が必要です。)

12
Evan Carroll