Data Type


SQL Server 資料型別(Data Type)也可稱為資料類型,定義資料表欄位能儲存哪種類型資料,以及使用多少位元組來儲存資料,在 SQL Server 內可以分為兩種類型:系統內建資料類型以及使用者自訂資料類型


系統內建資料類型可分為

  • 數值資料類型
    • 位元
    • 整數
    • 精確小數
    • 浮點數
    • 貨幣
  • 日期資料類型
  • 字元與位元串流資料類型
    • 字串
    • Unicode字元字串
    • 二進位字串
  • 其他資料類型
    • 標記(timestamp、rowversion、uniqueidentifier)
    • XML
    • Sql_variant
    • 階層(hierarchyid)
    • 空間
    • T-SQL 變數的資料類型(table、cursor)

使用者自訂資料類型:使用 SQL Server 原生資料型別當作基礎來建立自訂 Data Type,假設建立一個以 varchar 型別為基礎的 address 別名資料型別,可以這麼做

CREATE TYPE address
FROM varchar(35) NOT NULL

數值資料類型

  • 位元
    Bit 資料類型的值可為 0 或 1 ,特別適合使用在布林資料的欄位,例如真與假
型別 範圍 位元數長度
bit 0、1、Null 1 bits
  • 整數
    顧名思義,整數不包含小數的數值,只可儲存整數型態的資料
型別 範圍 位元數長度
tinyint 0~255 1 bytes
smallint -32,768~32,767 2 bytes
int -2,147,483,648~2,147,483,647 4 bytes
bigint -9,233,372,036,854,775,808~9,233,372,036,854,775,807 8 bytes
  • 精確小數
    可以儲存包含小數的資料,精確小數的兩種型別 numeric 及 decimal 完全相同,numeric 會完全依照指定保留精確度,deciaml 則會高於指定保留精確度,使用上需指名有效位數,定義為 numeric(p, s)及 decimal(p, s),p 代表有效位數(包含整數及小數),s 代表小數的個數,例如 numeric(8, 3)表示有效位數為 8(精確度為 8),其中有 5 個整數 3 個小數。
    若不指定的情況下,預設為 numeric(18, 0),有效位數預設為 18;指定的情況下,小數位數最少為 0,也不可超過精確度
型別 範圍 位元數長度
numeric -1038+1~1038-1 視精確度而定5~17 bytes
decimal -1038+1~1038-1 視精確度而定5~17 bytes
有效位數 位元長度
1~9 5 bytes
10~19 9 bytes
20~28 13 bytes
29~38 17 bytes
  • 浮點數
    可用來儲存含有小數點的數值資料,此類型也稱為不精確小數資料型別,因為當數值非常大或非常小時,儲存的資料會是一個近似值,例如 1/3 的結果會得到一個近似值
型別 範圍 位元數長度
float -1.78E+308~1.79E+308(精確度為1~15位) 4 或 8 bytes
real -3.40E+38~3.40E+38(精確讀為1~7位) 4 bytes
  • 貨幣
    在貨幣表示上,習慣為三位數加上一個逗號,因此貨幣型別允許使用者在輸入時以三位數加上一個逗號方式輸入,但儲存後逗號不會被展現出來
型別 範圍 位元數長度
money -922,337,203,685,477.5808~922,337,203,685,477.5807(可精確到小數第 4 位) 8 bytes
smallmoney -214,748.3648~214,748.3647(可精確到小數第 4 位) 4 bytes

日期資料類型

SQL Server 提供 datetime 及 smalldatetime 來表示日期型態,而 SQL Server 2008 之後的版本新增 date、time、datetime 和 datetimeoffset 四種日期資料型別

型別 輸出格式 位元數長度
datetime 2020-05-20 12:51:30.123 8 bytes
smalldatetime 2020-05-20 12:51:30 4 bytes(前 2 bytes 儲存日期.後 2 bytes 儲存時間)
date 2020-05-20 3 bytes
time 12:51:30.1234567 3~5 bytes
datetime2 2020-05-20 12:51:30.1234567 6~8 bytes
datetimeoffset 2020-05-20 12:51:30.1234567+12:15 8~10 bytes

也建議使用者不再使用 datetime 和 smalldatetime ,主要的原因有當日期和時間合併在一起,當挑選某特定日期(2020-05-20)而不包含時間時,系統會視為 2020-05-20 00:00:00,造成 2020-05-20 12:51:30 不會被挑選;datetime 型別精確度可接受到 3.33 毫秒,所以每天開始與結束的時間為 00:00:00.000 至 23:59:59.997,若為 998 則會被進位處理為 997,999 則進位處理為隔日。


字元與位元串流資料類型

  • 字串
    主要分為「固定長度」及「變動長度」,char(n) 屬於固定長度的型別,一旦宣告 n 值所占空間及固定,不因儲存的資料做調整,缺少的字元空間會以空白字元補齊,如 char(5)儲存 'abc' 三個字元,仍占用 5 bytes;varchar、varchar(max)、text 屬於變動長度的型別,可儲存最大為 n 個字元,會因儲存的資料大小而變動,如 varchar(5)儲存 'abc' 三個字元,最終僅佔用 3 Bytes 而不會使用到 5 Bytes,相較之下比固定長度還節省空間
型別 範圍 位元數長度
char(n) 1~8000 字元或 1~4000 中字 最大 8000 bytes
varchar(n) 1~8000 字元或 1~4000 中字 最大 8000 bytes
varchar(max) 1~231-1 個字元 231-1 bytes
text 1~231-1 個字元 231-1 bytes
  • Unicode字元字串
    與字串型別類似,不同的是儲存資料為 Unicode(萬用碼),Unicode 是雙位元文字編碼標準,可儲存世界各國的文字,儲存的大小則是「每個 Unicode 字元佔用 2 bytes,一般字串則是一個字元佔用 1 bytes」
型別 範圍 位元數長度
nchar(n) 1~4000 字元 n x 2 個 bytes
nvarchar(n) 1~4000 字元 n x 2 個 bytes
nvarchar(max) 1~230-1 字元 最大可達 2G
ntext 1~230-1 字元 最大可達 2G
  • 二進位字串
    顧名思義,是用來儲存二進位碼,與字串、Unicode 字元字串型別類似,差別於儲存的資料型態
型別 範圍 位元數長度
binary(n) 1~8000 bytes n bytes
varbinary(n) 1~8000 bytes 最大為 n bytes
varbinary(max) 1~231-1 bytes 最大為 2G
image 1~231-1 bytes 最大為 2G

其他資料類型

因個人鮮少有機會使用到此類型型別,甚至有的也從來沒使用過,未來有機會研究則會再補上,有興趣者可以參考官網,這邊則不加以介紹。


Reference


Data types (Transact-SQL)

#Data Type #MS SQL
MS SQL 內功心法
MS SQL 基礎介紹及語法教學






Related Posts

DAY 02 : 演算法基本概念

DAY 02 : 演算法基本概念

Ritsuki0713
[程式挑戰] 全域變數和區域變數可視範圍 Variable Scope

[程式挑戰] 全域變數和區域變數可視範圍 Variable Scope

HappyCoder 自學程式設計學院
Alibaba Cloud Learning Path

Alibaba Cloud Learning Path

hsychen


Comments