- SQL 教程
- SQL - 首頁
- SQL - 概述
- SQL - RDBMS 概念
- SQL - 資料庫
- SQL - 語法
- SQL - 資料型別
- SQL - 運算子
- SQL - 表示式
- SQL 資料庫
- SQL - 建立資料庫
- SQL - 刪除資料庫
- SQL - 選擇資料庫
- SQL - 重新命名資料庫
- SQL - 顯示資料庫
- SQL - 備份資料庫
- SQL 表
- SQL - 建立表
- SQL - 顯示錶
- SQL - 重命名錶
- SQL - 清空表
- SQL - 克隆表
- SQL - 臨時表
- SQL - 修改表
- SQL - 刪除表
- SQL - 刪除表
- SQL - 約束
- SQL 查詢
- SQL - 插入查詢
- SQL - 選擇查詢
- SQL - Select Into
- SQL - Insert Into Select
- SQL - 更新查詢
- SQL - 刪除查詢
- SQL - 排序結果
- SQL 檢視
- SQL - 建立檢視
- SQL - 更新檢視
- SQL - 刪除檢視
- SQL - 重新命名檢視
- SQL 運算子和子句
- SQL - Where 子句
- SQL - Top 子句
- SQL - Distinct 子句
- SQL - Order By 子句
- SQL - Group By 子句
- SQL - Having 子句
- SQL - AND & OR
- SQL - BOOLEAN (BIT) 運算子
- SQL - LIKE 運算子
- SQL - IN 運算子
- SQL - ANY, ALL 運算子
- SQL - EXISTS 運算子
- SQL - CASE
- SQL - NOT 運算子
- SQL - 不等於
- SQL - IS NULL
- SQL - IS NOT NULL
- SQL - NOT NULL
- SQL - BETWEEN 運算子
- SQL - UNION 運算子
- SQL - UNION 與 UNION ALL
- SQL - INTERSECT 運算子
- SQL - EXCEPT 運算子
- SQL - 別名
- SQL 連線
- SQL - 使用連線
- SQL - 內連線
- SQL - 左連線
- SQL - 右連線
- SQL - 交叉連線
- SQL - 全連線
- SQL - 自連線
- SQL - 刪除連線
- SQL - 更新連線
- SQL - 左連線與右連線
- SQL - Union 與 Join
- SQL 金鑰
- SQL - 唯一鍵
- SQL - 主鍵
- SQL - 外部索引鍵
- SQL - 複合鍵
- SQL - 備用鍵
- SQL 索引
- SQL - 索引
- SQL - 建立索引
- SQL - 刪除索引
- SQL - 顯示索引
- SQL - 唯一索引
- SQL - 聚集索引
- SQL - 非聚集索引
- 高階 SQL
- SQL - 萬用字元
- SQL - 註釋
- SQL - 注入
- SQL - 託管
- SQL - Min & Max
- SQL - Null 函式
- SQL - 檢查約束
- SQL - 預設約束
- SQL - 儲存過程
- SQL - NULL 值
- SQL - 事務
- SQL - 子查詢
- SQL - 處理重複項
- SQL - 使用序列
- SQL - 自動遞增
- SQL - 日期和時間
- SQL - 遊標
- SQL - 公共表表達式
- SQL - Group By 與 Order By
- SQL - IN 與 EXISTS
- SQL - 資料庫調優
- SQL 函式參考
- SQL - 日期函式
- SQL - 字串函式
- SQL - 聚合函式
- SQL - 數值函式
- SQL - 文字和影像函式
- SQL - 統計函式
- SQL - 邏輯函式
- SQL - 遊標函式
- SQL - JSON 函式
- SQL - 轉換函式
- SQL - 資料型別函式
- SQL 有用資源
- SQL - 問答
- SQL - 快速指南
- SQL - 有用函式
- SQL - 有用資源
- SQL - 討論
SQL - 資料型別
什麼是 SQL 資料型別?
SQL 資料型別是指可以儲存在資料庫表列中的資料型別。在列中,使用者可以透過定義資料型別來儲存數字、字串、二進位制等。例如整數資料、字元資料、貨幣資料、日期和時間資料、二進位制字串等。
在資料庫中建立資料庫表時,我們需要指定以下兩個屬性來定義表列
- 列名
- 列的資料型別
資料庫表的列定義資料,而資料庫表的行將資料填充到表中。
例如,如果要在一個列中儲存學生姓名,則應將列名命名為類似student_name,其資料型別為char(50),這意味著它可以儲存最多 50 個字元的字串。
資料型別為SQL提供了指導,使其瞭解每列中期望的資料型別,從而防止使用者在列中輸入任何意外或無效的資料。例如,如果我們希望一個列僅儲存整數值,我們可以將其資料型別指定為 INT。如果在該特定列中插入任何整數值以外的值,SQL 將顯示錯誤。
不同的 RDBMS 支援不同型別的資料型別來定義其表。本SQL 資料型別教程將列出 MySQL、Oracle、MS SQL Server 和 MS Access 資料庫中可用的不同資料型別。
定義資料型別
SQL 資料型別在資料庫中建立表時定義。建立表時,需要指定其相應的資料型別和大小以及列名。
以下是指定 MySQL 中資料型別的語法:
CREATE TABLE table_name(column1 datatype, column2 datatype....)
讓我們看下面的示例查詢以更好地理解。
CREATE TABLE Customers (Name VARCHAR (25), Age INT);
在上面的 SQL 查詢中,我們正在建立一個名為 Customers 的表。由於 Name 列僅儲存字串值,因此我們將它的資料型別指定為“VARCHAR”。VARCHAR 資料型別表示 SQL 中的字串值。類似地,我們使用整數資料型別“INT”定義 Age 列。
當我們將適當的資料型別分配給列時,我們可以透過僅為相關列中的資料分配所需的系統記憶體量來有效地使用記憶體。
SQL 資料型別的型別
任何 RDBMS 中都提供三種主要型別的 SQL 資料型別。它們列在下面:
- 字串
- 數值
- 日期和時間
MySQL、SQL Server、Oracle 和 MS Access 資料庫中的資料型別
讓我們詳細討論 MySQL、SQL Server、Oracle(PL/SQL)和 MS Access 資料庫中的資料型別。下面解釋了所有三種主要型別(字串、數值、日期和時間)的 SQL 資料型別:
MySQL 資料型別
MySQL 資料庫中提供了三種主要資料型別:字串、數值和日期和時間。以下部分列出了 MySQL 8.0 版本中可用的所有資料型別
MySQL - 字串資料型別
| 資料型別 | 描述 |
|---|---|
| CHAR(size) | 固定長度的字串,可以包含字母、數字和特殊字元。size 引數指定列的字元長度,可以從 0 到 255 不等。預設大小為 1 |
| VARCHAR(size) | 可變長度的字串,可以包含字母、數字和特殊字元。size 引數指定字元的最大字串長度,可以從 0 到 65535 不等。 |
| BINARY(size) | 等於 CHAR(),但儲存二進位制位元組字串。size 引數指定列的位元組長度。預設大小為 1 |
| VARBINARY(size) | 等於 VARCHAR(),但儲存二進位制位元組字串。size 引數指定列的最大位元組長度。 |
| TINYTEXT | 儲存最大長度為 255 個字元的字串 |
| TEXT(size) | 儲存最大長度為 65,535 個位元組的字串 |
| LONGTEXT | 儲存最大長度為 4,294,967,295 個字元的字串 |
| TINYBLOB | 表示小型 BLOB(二進位制大型物件)。最大長度為 255 個位元組 |
| BLOB(size) | 表示 BLOB(二進位制大型物件)。儲存最多 65,535 個位元組的資料 |
| MEDIUMTEXT | 儲存最大長度為 16,777,215 個字元的字串 |
| MEDIUMBLOB | 表示中型 BLOB(二進位制大型物件)。儲存最多 16,777,215 個位元組的資料 |
| LONGBLOB | 表示大型 BLOB(二進位制大型物件)。儲存最多 4,294,967,295 個位元組的資料 |
| ENUM(val1, val2, val3, ...) | 一個字串物件,只能包含一個值,該值從可能的列表中選擇。您可以在 ENUM 列表中列出最多 65535 個值。如果插入的值不在列表中,則將插入一個空值。這些值按您輸入的順序排序 |
| SET(val1, val2, val3, ...) | 一個字串物件,可以包含 0 個或多個值,這些值從可能的列表中選擇。您可以在 SET 列表中列出最多 64 個值 |
MySQL - 數值資料型別
| 資料型別 | 描述 |
|---|---|
| INT | 一個普通大小的整數,可以是有符號或無符號的。如果是有符號的,則允許的範圍是從 -2147483648 到 2147483647。如果是無符號的,則允許的範圍是從 0 到 4294967295。您可以指定最多 11 位的寬度。 |
| TINYINT | 一個非常小的整數,可以是有符號或無符號的。如果是有符號的,則允許的範圍是從 -128 到 127。如果是無符號的,則允許的範圍是從 0 到 255。您可以指定最多 4 位的寬度。 |
| SMALLINT | 一個小的整數,可以是有符號或無符號的。如果是有符號的,則允許的範圍是從 -32768 到 32767。如果是無符號的,則允許的範圍是從 0 到 65535。您可以指定最多 5 位的寬度。 |
| MEDIUMINT | 一箇中等大小的整數,可以是有符號或無符號的。如果是有符號的,則允許的範圍是從 -8388608 到 8388607。如果是無符號的,則允許的範圍是從 0 到 16777215。您可以指定最多 9 位的寬度。 |
| BIGINT | 一個大的整數,可以是有符號或無符號的。如果是有符號的,則允許的範圍是從 -9223372036854775808 到 9223372036854775807。如果是無符號的,則允許的範圍是從 0 到 18446744073709551615。您可以指定最多 20 位的寬度。 |
| FLOAT(M,D) | 一個浮點數,不能是無符號的。您可以定義顯示長度 (M) 和小數位數 (D)。這不是必需的,並將預設為 10,2,其中 2 是小數位數,10 是總位數(包括小數)。FLOAT 的小數精度可以達到 24 位。 |
| DOUBLE(M,D) | 一個雙精度浮點數,不能是無符號的。您可以定義顯示長度 (M) 和小數位數 (D)。這不是必需的,並將預設為 16,4,其中 4 是小數位數。DOUBLE 的小數精度可以達到 53 位。REAL 是 DOUBLE 的同義詞。 |
| DECIMAL(M,D) | 一個未打包的浮點數,不能是無符號的。在未打包的小數中,每個小數對應一個位元組。定義顯示長度 (M) 和小數位數 (D) 是必需的。NUMERIC 是 DECIMAL 的同義詞。 |
MySQL - 日期和時間資料型別
| 資料型別 | 描述 |
|---|---|
| DATE | YYYY-MM-DD 格式的日期,介於 1000-01-01 和 9999-12-31 之間。例如,1973 年 12 月 30 日將儲存為 1973-12-30。 |
| DATETIME | YYYY-MM-DD HH:MM:SS 格式的日期和時間組合,介於 1000-01-01 00:00:00 和 9999-12-31 23:59:59 之間。例如,1973 年 12 月 30 日下午 3:30 將儲存為 1973-12-30 15:30:00。 |
| TIMESTAMP | 一個時間戳,介於1970年1月1日午夜到2037年某個時間之間。這看起來像之前的DATETIME格式,只是數字之間沒有連字元;1973年12月30日下午3:30將儲存為19731230153000(YYYYMMDDHHMMSS)。 |
| TIME | 以HH:MM:SS格式儲存時間。 |
| YEAR(M) | 以2位或4位格式儲存年份。如果長度指定為2(例如YEAR(2)),則YEAR可以是1970到2069(70到69)。如果長度指定為4,則YEAR可以是1901到2155。預設長度為4。 |
MS SQL Server 資料型別
正如我們在本章前面討論過的,MS SQL Server中有三種主要的資料型別。它們是:字串、數值和日期和時間。
MS SQL Server - 字串資料型別
SQL中的字串資料型別允許我們將一組字元(用單引號括起來)儲存在表列的記錄中。這些字元可以是任何型別:數字、字母、符號等。
使用者可以根據自己的喜好儲存固定數量的字元或可變數量的字元。
以下是SQL中字串資料型別下包含的資料型別列表。
| 資料型別 | 描述 |
|---|---|
| char(n) | 它儲存具有固定寬度的字串。此資料型別的最大大小為8000個字元。 |
| varchar(n) | 它儲存具有可變寬度的字串。此資料型別的最大大小也為8000個字元。 |
| varchar(max) | 它儲存具有可變寬度的字串。此資料型別的最大大小為1073741824個字元。 |
| text | 它儲存具有可變寬度的字串。此資料型別最多可以儲存2GB的文字資料。 |
| nchar | 它儲存具有固定寬度的Unicode字串。此資料型別的最大大小也為4000個字元。 |
| nvarchar | 它儲存具有可變寬度的Unicode字串。此資料型別的最大大小也為4000個字元。 |
| ntext | 它儲存具有可變寬度的Unicode字串。此資料型別最多可以儲存2GB的文字資料。 |
| binary(n) | 它儲存具有固定寬度的二進位制字串。 |
| varbinary | 它儲存具有可變寬度的二進位制字串。此資料型別的最大大小也為8000位元組。 |
| varbinary(max) | 它儲存最大長度的可變寬度二進位制字串。此資料型別的最大大小為2 GB。 |
| image | 它儲存可以儲存二進位制資料的資料型別的可變長度。此資料型別的最大大小為2 GB。 |
| Nvarchar(max) | 它儲存最大長度的可變寬度Unicode字串。此資料型別的最大大小為536870912個字元。 |
示例
在下面的示例中,我們正在建立一個名為“students”的表,其中僅包含字串資料型別值:varchar和char。
CREATE TABLE students ( name varchar(20) NOT NULL, gender char(6) NOT NULL, city text NOT NULL );
輸出
執行查詢後,將顯示輸出為 -
(0 rows affected)
驗證
在執行SQL查詢“EXEC sp_help 'dbo.students';”時,我們獲得了表和每個列的資料型別的詳細資訊。
| Column_name | Type | Computed | Length | Prec | Scale | Nullable |
|---|---|---|---|---|---|---|
| name | varchar | no | 20 | no | ||
| gender | char | no | 6 | no | ||
| city | text | no | 16 | no |
MS SQL Server - 數值資料型別
數值資料型別是SQL中使用最廣泛的資料型別之一。它們僅用於儲存數值。
以下是SQL中數值資料型別下包含的資料型別列表。
| 資料型別 | 描述 |
|---|---|
| bit | 它儲存可以為0、1或NULL的整數。 |
| tinyint | 它允許儲存0到255之間的整數。 |
| smallint | 它允許儲存-32,768到32,767之間的數字。 |
| int | 它允許儲存-2,147,483,648到2,147,483,647之間的整數。 |
| bigint | 它允許儲存-9,223,372,036,854,775,808到9,223,372,036,854,775,807之間的整數 |
| decimal(p, s) | 它是固定精度和小數位數的數字。允許數字從-10^38 + 1到10^38-1。 引數p指示可以在小數點兩側(左側和右側)儲存的最大總位數。它必須是1到38之間的值。預設值為18。 引數s指示小數點右側的最大位數。S必須是0到p之間的值。預設情況下,該值設定為0。 |
| numeric(p, s) | 它是固定精度和小數位數的數字。允許數字從-10^38 + 1到10^38-1。 引數p指示可以在小數點兩側(左側和右側)儲存的最大總位數。它必須是1到38之間的值。預設值為18。 引數s指示小數點右側的最大位數。S必須是0到p之間的值。預設情況下,該值設定為0。 |
| smallmoney | 它儲存-214,748.3648到214,748.3647之間的貨幣資料。 |
| Money | 它儲存-922,337,203,685,477.5808到922,337,203,685,477.5807之間的貨幣資料。 |
Float(n) | 它儲存或儲存-1.79E + 308到1.79E + 308之間的浮點精度數字資料。 引數n指示欄位應儲存4位元組還是8位元組。Float(24)包含4位元組欄位,而Float(53)包含8位元組欄位。n的預設值為53。 |
| real | 它儲存-3.40E + 38到3.40E + 38之間的浮點精度數字資料。 |
示例
在下面的示例中,我們正在建立一個名為employees的表,其中僅包含數值資料型別值。
CREATE TABLE employees ( ID int NOT NULL, myBoolean bit NOT NULL, Fee money, celsius float NOT NULL );
輸出
執行查詢後,將顯示輸出為 -
(0 rows affected)
驗證
在執行SQL查詢“EXEC sp_help 'dbo.employees;”時,我們獲得了表和每個列的資料型別的詳細資訊。
| Column_name | Type | Computed | Length | Prec | Scale | Nullable |
|---|---|---|---|---|---|---|
| ID | int | no | 4 | 10 | 0 | no |
| myBoolean | bit | no | 1 | no | ||
| Fee | money | no | 18 | 19 | 4 | yes |
| Celsius | float | no | 8 | 53 | NULL | no |
MS SQL Server - 日期和時間資料型別
datetime資料型別在SQL中用於包含日期和時間的值。datetime和time值的格式分別定義為:yyyy-mm-dd、hh:mm:ss.nnnnnnn(n取決於列定義)。
以下是SQL中日期和時間資料型別下包含的資料型別列表。
| 資料型別 | 描述 |
|---|---|
| datetime | 它儲存1753年1月1日至9999年12月31日之間的日期和時間,精度為3.33毫秒。 |
| datetime2 | 它儲存0001年1月1日至9999年12月31日之間的日期和時間,精度為100納秒。 |
| smalldatetime | 它儲存1900年1月1日至2079年6月6日之間的日期和時間,精度為1分鐘。 |
| date | 它僅儲存0001年1月1日至9999年12月31日之間的日期。 |
| time | 它僅儲存時間,精度為100納秒。 |
| datetimeoffset | 它與datetime2相同,並增加了時區偏移量。 |
| timestamp | 它儲存每次建立或修改行時都會更新的唯一編號。它與實際時間不對應,並且基於內部時間。每個表只能有一個timestamp變數。 |
注意 - 這裡,datetime的精度為3.33毫秒,而smalldatetime的精度為1分鐘。
示例
在下面的示例中,我們正在建立一個名為Cust_details的表,其中僅包含日期和時間資料型別值。
CREATE TABLE Cust_details ( HolidayDate DATE NOT NULL, OrderDateTime DATETIME, ScheduleFrom TIME NOT NULL, ShippingDateTime DATETIME2 );
輸出
執行查詢後,將顯示輸出為 -
(0 rows affected)
驗證
在執行SQL查詢“EXEC sp_help 'dbo.Cust_details;”時,我們獲得了表和每個列的資料型別的詳細資訊。
| Column_name | Type | Computed | Length | Prec | Scale | Nullable |
|---|---|---|---|---|---|---|
| HolidayDate | date | no | 3 | 10 | 0 | no |
| OrderDateTime | datetime | no | 8 | yes | ||
| ScheduleFrom | time | no | 5 | 16 | 7 | no |
| ShippingDateTime | datetime2 | no | 8 | 27 | 7 | yes |
注意
- 如果您使用MySQL Workbench執行SQL資料型別及其查詢,則某些SQL資料型別和日期和時間的格式將無法使用;例如“money”、“datetime2”、“yyyy/mm/dd”和“time AM”。所有這些指定的資料型別僅與SQL Server相容。
- 這些資料型別的大小可能會在將來的更新中發生變化,請繼續檢查SQL文件。
Oracle 資料型別
在Oracle資料庫中有四種主要型別的資料型別可用:字串、數值、日期和時間以及大型物件資料型別。以下部分列出了Oracle資料庫中所有可用的資料型別。
Oracle - 字串資料型別
| 資料型別 | 描述 |
|---|---|
| CHAR(size) | 它用於在預定義的長度記憶體儲字元資料。它最多可以儲存2000個位元組。 |
| NCHAR(size) | 它用於在預定義的長度記憶體儲國家字元資料。它最多可以儲存2000個位元組。 |
| VARCHAR2(size) | 它用於在預定義的長度記憶體儲可變字串資料。它最多可以儲存4000個位元組。 |
| VARCHAR(SIZE) | 它與VARCHAR2(size)相同。您也可以使用VARCHAR(size),但建議使用VARCHAR2(size) |
| NVARCHAR2(size) | 它用於在預定義的長度記憶體儲Unicode字串資料。我們必須指定NVARCHAR2資料型別的大小。它最多可以儲存4000個位元組。 |
Oracle - 數值資料型別
| 資料型別 | 描述 |
|---|---|
| NUMBER(p, s) | 它包含精度p和小數位數s。精度p的範圍可以是1到38,小數位數s的範圍可以是-84到127。 |
| FLOAT(p) | 它是NUMBER資料型別的一個子型別。精度p的範圍可以是1到126。 |
| BINARY_FLOAT | 它用於二進位制精度(32位)。它需要5個位元組,包括長度位元組。 |
| BINARY_DOUBLE | 它用於雙精度二進位制(64位)。它需要9個位元組,包括長度位元組。 |
Oracle - 日期和時間資料型別
| 資料型別 | 描述 |
|---|---|
| DATE | 它用於儲存具有固定長度的有效日期時間格式。它的範圍從公元前4712年1月1日至公元9999年12月31日不等。 |
| TIMESTAMP | 它用於以YYYY-MM-DD格式儲存有效日期,時間格式為hh:mm:ss。 |
Oracle - 大型物件資料型別(LOB型別)
| 資料型別 | 描述 |
|---|---|
| BLOB | 它用於指定非結構化二進位制資料。它的範圍高達232-1位元組或4 GB。 |
| BFILE | 它用於在外部檔案中儲存二進位制資料。它的範圍高達232-1位元組或4 GB。 |
| CLOB | 它用於單位元組字元資料。它的範圍高達232-1位元組或4 GB。 |
| NCLOB | 它用於指定單位元組或固定長度多位元組國家字元集(NCHAR)資料。它的範圍高達232-1位元組或4 GB。 |
| RAW(size) | 它用於指定可變長度原始二進位制資料。它的範圍每行最多2000個位元組。必須指定其最大大小。 |
| LONG RAW | 它用於指定可變長度原始二進位制資料。它的範圍每行最多231-1位元組或2 GB。 |
MS Access 資料型別
MS Access 資料庫還提供四類資料型別:字串、數值、日期和時間以及其他專用資料型別。
以下是 MS Access 2013 版本及更高版本提供的所有資料型別。
MS Access - 字串資料型別
| 資料型別 | 描述 |
|---|---|
| 短文字(以前稱為“文字”) | 它是一種字串資料型別,用於儲存字母數字資料,例如姓名、標題等。它最多可以儲存 255 個字元。 |
| 長文字(以前稱為“備註”) | 它也是一種字串資料型別,用於儲存大型字母數字資料,例如段落等。它最多可以儲存 1GB 或 64,000 個字元。 |
MS Access - 數值資料型別
| 資料型別 | 描述 |
|---|---|
| 數字 | 它僅儲存數值資料。大小範圍從 1 到 16 個位元組。 |
| 大數字 | 它也儲存數值資料。此資料型別的最大大小為 8 個位元組。 |
MS Access - 日期和時間資料型別
| 資料型別 | 描述 |
|---|---|
| 日期/時間 | 它儲存日期和時間資料。此資料型別的最大大小為 8 個位元組。 |
| 擴充套件日期/時間 | 它也儲存日期和時間資料。此資料型別的最大大小為 42 位元組的編碼字串。 |
MS Access - 專用資料型別
| 資料型別 | 描述 |
|---|---|
| 貨幣 | 此資料型別儲存貨幣資料,最多可精確到小數點後 4 位。此資料型別的大小為 8 個位元組。 |
| 自動編號 | 此資料型別儲存由 MS Access 為每個新記錄生成的唯一值。此資料型別的大小為 4 個位元組。 |
| 是/否 | 它以 0 和 1 的形式儲存布林資料。'0' 表示假,'-1' 表示真。最大大小為 1 個位元組。 |
| OLE 物件 | 它儲存來自另一個基於 Windows 的應用程式的圖片、圖形或其他 ActiveX 物件。大小可以儲存高達 2GB。 |
| 超連結 | 它儲存指向 Internet、Intranet、區域網 (LAN) 或本地計算機上文件或檔案的連結地址。大小可以高達 8,192 個字元。 |
| 附件 | MS Access 中的附件資料型別允許使用者附加圖片、文件、電子表格或圖表等。每個記錄可以有無限數量的附件;但僅限於資料庫檔案大小的儲存限制。 |
| 計算 | 使用此資料型別,您可以建立一個使用一個或多個欄位中的資料的表示式。然後,還可以從此表示式建立結果資料型別。但是,此資料型別在 MDB 檔案格式中不可用。此資料型別的大小可能因結果型別而異。 |
| 查詢嚮導 | 查詢嚮導在技術上不是資料型別。但是,當選擇此條目時,嚮導將啟動以幫助使用者定義查詢欄位。此資料型別的大小取決於查詢欄位的大小。 |