为什么 information_schema 有“YES”和“NO”字符串而不是布尔值?

dev*_*xer 7 postgresql information-schema sql-standard

我惊讶地发现is_nullable此查询的列被键入character varying (3)而不是boolean

select
    column_name,
    data_type,
    is_nullable
from
    information_schema.columns
where
    table_schema = 'public';
Run Code Online (Sandbox Code Playgroud)

我注意到其他一些列也使用“是”/“否”。这样做的理由是什么?我最初的想法是,也许除了 "YES" 和 "NO" 之外的其他值也是可能的,证明 a 以外的其他值是合理的boolean,但我在当前的数据库中没有看到任何这样的例子。

Eva*_*oll 12

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       |           |          | 
Run Code Online (Sandbox Code Playgroud)

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,
Run Code Online (Sandbox Code Playgroud)

你也可以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;
Run Code Online (Sandbox Code Playgroud)

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 | 
Run Code Online (Sandbox Code Playgroud)

有你的布尔值。

PostgreSQL 文档

关于信息架构PostgreSQL 文档:数据类型实际上也解决了这个问题,

包含YESNO 的字符串域。这用于表示信息模式中的布尔(真/假)数据。(信息模式是在将类型boolean添加到 SQL 标准之前发明的,因此此约定对于保持信息模式向后兼容是必要的。)