跳轉到內容

結構化查詢語言/資料型別

來自華夏公益教科書,開放的書籍,開放的世界



SQL 標準知道三種資料型別

  • 預定義資料型別
  • 構造型別
  • 使用者定義型別。

此頁面僅介紹預定義資料型別構造型別是陣列、多重集、引用(引用)或行的其中之一。使用者定義型別類似於面嚮物件語言中的類,具有自己的建構函式、觀察器、變異器、方法、繼承、過載、覆蓋、介面等。

標準將預定義資料型別分組為具有相似特徵的型別。

  • 字元型別
  • 字元(CHAR)
  • 可變字元(VARCHAR)
  • 字元大物件(CLOB)
  • 二進位制型別
  • 二進位制(BINARY)
  • 可變二進位制(VARBINARY)
  • 二進位制大物件(BLOB)
  • 數值型別
  • 精確數值型別(NUMERIC、DECIMAL、SMALLINT、INTEGER、BIGINT)
  • 近似數值型別(FLOAT、REAL、DOUBLE PRECISION)
  • 日期時間型別(DATE、TIME、TIMESTAMP)
  • 間隔型別(INTERVAL)
  • 布林值
  • XML
  • JSON(自 SQL:2016

字元型別儲存可列印字元,二進位制型別儲存任何二進位制資料。兩者都可以具有固定或可變大小,並具有上限。如果上限超過某個值,則該型別將成為具有特殊方法和函式的“大物件”。

精確數值型別儲存沒有小數點後數字或具有固定數量小數點後數字的數值。請注意,標準沒有定義單獨的資料型別“自動遞增”來生成主鍵。相反,它在 CREATE TABLE 語句中定義了短語“GENERATED ALWAYS AS IDENTITY”,請參閱CREATE TABLE 語句自動遞增列.

近似數值型別儲存具有實現定義精度(小數點後)的數值。

時間型別儲存 INTERVAL(時間軸上的某個範圍)、DATE(年、月、日)、帶有時區和不帶有時區的 TIME(時區名稱、小時、分鐘、秒,包括小數部分)和帶有時區和不帶有時區的 TIMESTAMP(時區名稱、年到秒,包括小數部分)的值。

布林資料型別儲存兩個值truefalse

SQL 標準的第 14 部分透過引入資料型別 XML(Oracle 稱之為 XMLType)以及大量特定函式,擴充套件了預定義資料型別的列表。此型別的列儲存 XML 例項。

在過時的 SQL-2 標準中,存在資料型別“BIT”。此資料型別不再是標準的一部分。

大多數 DBMS 實現了大多數預定義資料型別,但存在一些例外。此外,命名略有不同。可以在華夏公益教科書SQL_Dialects_Reference中找到主要實現的概述。

資料型別在 CREATE TABLE 語句中用作列定義的一部分,或在 CAST 操作期間使用。

CREATE TABLE <tablename> (
  <column_name> <data_type> ... ,
  <column_name> <data_type> ... ,
  ...
);

一系列可列印字元(即字串)可以儲存在字元字串型別中。如果表的所有行都使用相同大小的字串,則資料型別為CHAR(<n>),其中<n>是字串的大小。如果大小在各行之間不同,則資料型別VARCHAR(<n>)定義了該列可以儲存最多<n>個字元。因此,<n>定義了該列的上限。<n>的最大值取決於使用的 DBMS 實現。如果應用程式需要儲存比此係統上限允許的更長的字串,則必須使用資料型別CLOBCLOB也有自己的上限,但它明顯大於VARCHAR的上限。

-- A table with columns of fixed and variable size strings and a CLOB string
CREATE TABLE datatypes_1 (
  id    DECIMAL PRIMARY KEY,
  col_1 CHAR(10),       -- exactly 10 characters
  col_2 VARCHAR(150),   -- up to 150 characters
  col_3 CLOB            -- very large strings (MySQL denotes this data type: 'LONGTEXT')
);

提示:與其他程式語言不同,SQL 不區分字元資料型別字串資料型別。它只知道字元字串資料型別 CHAR、VARCHAR 和 CLOB。

二進位制

[編輯 | 編輯原始碼]

二進位制資料型別類似於字元資料型別。它們的不同之處在於它們接受不同的位元組範圍。二進位制資料型別接受所有值。

-- A table with columns of fixed and variable size binary data and a BLOB
CREATE TABLE datatypes_2 (
  id    DECIMAL PRIMARY KEY,
  col_1 BINARY(10),     -- exactly 10 byte
  col_2 VARBINARY(150), -- up to 150 byte
  col_3 BLOB            -- very large data: jpeg, mp3, ...
);

針對 Oracle 使用者的提示:資料型別BINARY不受支援,資料型別VARBINARY被表示為RAW並且已棄用。Oracle 建議使用BLOB

精確數值

[編輯 | 編輯原始碼]

精確數值型別儲存沒有小數點後數字或具有固定數量小數點後數字的數值。所有精確數值型別都是有符號的。

NUMERIC(<p>,<s>)DECIMAL(<p>,<s>)表示兩種幾乎相同的型別。<p>(精度)定義了型別中所有數字的固定數量,而<s>(小數位數)定義了這些數字中哪些數字位於小數點後。小數點前超過 (p - s) 位的數值無法儲存,小數點後超過 s 位的數值將被截斷為小數點後 s 位。p 和 s 是可選的。它必須始終為:p ≥ s ≥ 0 且 p > 0。

SMALLINT、INTEGER 和 BIGINT 表示沒有小數點的資料型別。SQL 標準沒有定義它們的大小,但 SMALLINT 的大小應小於 INTEGER 的大小,INTEGER 的大小應小於 BIGINT 的大小。


-- A table using five exact numeric data types
CREATE TABLE datatypes_3 (
  id    DECIMAL PRIMARY KEY,
  col_1 DECIMAL(5,2),    -- three digits before the decimal and two behind
  col_2 SMALLINT,        -- no decimal point
  col_3 INTEGER,         -- no decimal point
  col_4 BIGINT           -- no decimal point. (Not supported by Oracle.)
);

近似數值

[編輯 | 編輯原始碼]

近似數值型別儲存具有實現定義精度(小數點後)的數值。所有近似數值型別都是有符號的。它們的主要用例是科學計算。

有三種類型:FLOAT (<p>)REALDOUBLE PRECISION,其中 p 表示FLOAT資料型別的保證精度。REALDOUBLE PRECISION的精度是實現定義的。

-- A table using the approximate numeric data types
CREATE TABLE datatypes_4 (
  id    DECIMAL PRIMARY KEY,
  col_1 FLOAT(2),     -- two or more digits after the decimal place
  col_2 REAL,
  col_3 DOUBLE PRECISION
);

與時間方面相關的資料型別是:DATE、TIME、TIMESTAMPINTERVAL

DATE儲存年、月和日。TIME儲存小時、分鐘和秒。TIMESTAMP儲存年、月、日、小時、分鐘和秒。秒可以包含小數點後的數字。TIMETIMESTAMP可以包含時區名稱。

SQL 標準定義了兩種 INTERVAL。第一種是包含年和月的間隔,第二種是包含日、小時、分鐘和秒的間隔。

-- A table using temporal data types
CREATE TABLE datatypes_5 (
  id    DECIMAL PRIMARY KEY,
  col_1 DATE,                       -- store year, month and day (Oracle: plus hour, minute and seconds) 
  col_2 TIME,
  col_3 TIMESTAMP(9),               -- a timestamp with 9 digits after the decimal of seconds
  col_4 TIMESTAMP WITH TIME ZONE,   -- a timestamp including the name of a timezone
  col_5 INTERVAL YEAR TO MONTH,
  col_6 INTERVAL DAY TO SECOND(6)   -- an interval with 6 digits after the decimal of seconds
);

針對 Oracle 使用者的提示:資料型別TIME不受支援。請改用DATE

針對 MySQL 使用者的提示:在資料型別中使用時區不受支援。MySQL 實現了不同的概念來處理時區。不支援秒的小數部分。資料型別INTERVAL不受支援,但存在資料值INTERVAL

布林值

[編輯 | 編輯原始碼]

SQL 具有三值邏輯。它知道布林值truefalseunknown。布林資料型別的列可以儲存兩個值truefalse中的一個。unknown透過不儲存任何值來表示,這就是 NULL 指示符。

-- A table with one column of boolean
CREATE TABLE datatypes_6 (
  id    DECIMAL PRIMARY KEY,
  col_1 BOOLEAN     -- not supported by Oracle
);

SQL 標準的第 14 部分透過引入 XML 資料型別擴充套件了預定義資料型別的列表。該標準還為這種資料型別定義了廣泛的特定函式。

-- A table with one column of data type XML 
CREATE TABLE datatypes_7 (
  id    DECIMAL PRIMARY KEY,
  col_1 XML
);

提示 Oracle 使用者:XML 資料型別表示為 XMLType

提示 MySQL 使用者:不支援 XML 資料型別。

在資料型別的上下文中,標準知道 *域*。域的目的是約束可以儲存在列中的有效值的集合。域的概念是使用者定義型別的早期前身,可能已經過時。

DROP TABLE datatypes_1;
DROP TABLE datatypes_2;
DROP TABLE datatypes_3;
DROP TABLE datatypes_4;
DROP TABLE datatypes_5;
DROP TABLE datatypes_6;
DROP TABLE datatypes_7;

建立一個名為“company”的表,其中包含列“id”(數字,主鍵)、“name”(最大長度為 200 的可變大小字串)、“isin”(長度為 12 的字串)、“stock_price”(小數點前 2 位,小數點後 2 位的數字)、“description_text”(非常大的字串)和“description_doc”(任何二進位制格式)。

點選檢視解決方案
CREATE TABLE company (
  id               DECIMAL PRIMARY KEY,
  name             VARCHAR(200),
  isin             CHAR(12),
  stock_price      DECIMAL(4,2),
  description_text CLOB,
  description_doc  BLOB
);


華夏公益教科書