Tại sao information_schema có các chuỗi ký tự của CÓ CÓ và và KHÔNG CÓ chứ không phải là booleans?


7

Tôi đã rất ngạc nhiên khi thấy rằng is_nullablecột cho truy vấn này được gõ character varying (3)thay vì boolean:

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

Tôi nhận thấy rằng một số cột khác cũng sử dụng "CÓ" / "KHÔNG". Lý do cho việc này là gì? Suy nghĩ ban đầu của tôi là có lẽ các giá trị khác ngoài "CÓ" và "KHÔNG" là có thể, chứng minh điều gì đó không phải là một boolean, nhưng tôi không thấy bất kỳ ví dụ nào về điều này trong cơ sở dữ liệu hiện tại của mình.

Câu trả lời:


12

INFORMATION_SCHEMA

Sử dụng psql bạn có thể thấy lược đồ với \d information_schema.columnshoặc bạn có thể tra cứu nó trong các tài liệu .

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

Thông số kỹ thuật SQL

Nhìn lên information_schema.columns.is_nullablethông số kỹ thuật chúng ta có thể thấy đó là lỗi của thông số kỹ thuật - như thường xảy ra với các công cụ. Bạn không thể xóa 9.000 năm di sản. Đặc biệt với một cái gì đó được cho là cung cấp một giao diện đáng tin cậy. Từ đặc tả SQL 2011,

IS_NULLABLE INFORMATION_SCHEMA.YES_OR_NO
  CONSTRAINT COLUMNS_IS_NULLABLE_NOT_NULL NOT NULL,

Và bạn cũng có thể thấy định nghĩa của INFORMATION_SCHEMA.YES_OR_NOđịnh nghĩa trong thông số kỹ thuật,

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;

Danh mục dành riêng cho RDBM của PostgreSQL

Nếu bạn không cần giao diện chuẩn hóa chung, bạn thường có thể tìm thấy thứ gì đó lành mạnh hơn pg_catalog. Trong trường hợp này bạn muốn pg_catalog.pg_attribute. Hãy kiểm tra xem \d pg_catalog.pg_attribute,

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

Có boolean của bạn.

Tài liệu PostgreSQL

Các tài liệu PostgreSQL về Lược đồ thông tin: Các kiểu dữ liệu cũng thực sự giải quyết vấn đề này,

Một miền chuỗi ký tự chứa hoặc KHÔNG . Điều này được sử dụng để thể hiện dữ liệu Boolean (đúng / sai) trong lược đồ thông tin. (Lược đồ thông tin được phát minh trước khi loại booleanđược thêm vào tiêu chuẩn SQL, vì vậy quy ước này là cần thiết để giữ cho lược đồ thông tin tương thích ngược.)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.