[Day3] SQL Server資料型態 - SQL Server資料庫入門

為了能夠讓每種資料有比較好的儲存方式,所以這回來看一下SQL server內建哪些資料型態。
我們平常常見資料可能會有日期、數字、文字等等。
爬了很多文後發現SQL Server的資料型態真的爆多,所以先列舉,未來如果有用到會陸續回來修補這篇文(X)。

整數

資料型別 位元數 資料範圍
tinyint  1 Byte 0 ~ 2^8 -1
( 0 ~ 255 )
smallint  2 Bytes -2^15 ~ 2^15-1
( -32738 ~ 32767 )
int  4 Bytes

-2^31 ~ 2^31 -1
( -2147483648 ~ 2147483467)

bigint  8 Bytes -2^63~2^63 -1
(-9223372036854775808 ~ 9223372036854776807 )
bit  1 Byte  0 , 1 , Null

精確位數與浮點數

資料型別 位元數 資料範圍 備註
numeric 視精確度而定 -10^38 +1 ~ 10^38 -1
decimal 視精確度而定 -10^38 +1 ~ 10^38 -1 如果要存有小數點的錢、金額請使用decimal,不要使用float,避免造成誤差
decimal(p,s) 需要分別指定小數的最大位數(p)和小數位的數量(s)。 p (precision) :指定小數的最大位數,小數點的左側和右側的數字的總數量不能超過p,p的取值範圍是從1到38,默認值爲18。 s (scale):指定在小數點右側的小數位數,p-s是小數點左邊的最大位數。s必須是從0到p的值,只有在指定了精度的情況下才能指定s,s的默認值是0,因此,0 <= s <= p。
float  8 Bytes  -1.79E+308 ~ 1.79E+308
15 位數
不要使用float存小數點的錢,避免造成誤差。他適合儲存科學用的數字。
real  4 Bytes
-3.40E+38 ~ 3.40E+38
  7 位數

字串 - Unicode 字串 - Binary 字串

資料型別 位元數 資料範圍 備註
 char(n) 1字元 1Byte  1 ~ 8000 字元 輸入的數據長度沒有達到指定的長度時將自動以英文空格在其後面填充,讓長度達到相對應的長度。
 varchar(n) 1字元 1Byte  1 ~ 8000 字元
輸入的數據長度沒有達到指定的長度時不會在後面填充空格。
 varchar(max) 變動長度 max=2GB  1 ~ 2^31 -1 字元
輸入的數據長度沒有達到指定的長度時不會在後面填充空格。
 text 變動長度 max=2GB  1 ~ 2^31 -1 字元
 nchar(n) 1字元 2Byte  1 ~ 4000 字元 所有的文字都用2 Byte來儲存
輸入的數據長度沒有達到指定的長度時將自動以英文空格在其後面填充,讓長度達到相對應的長度。
 nvarchar(n) 1字元 2Byte  1 ~ 4000 字元 所有的文字都用2 Byte來儲存
輸入的數據長度沒有達到指定的長度時不會在後面填充空格。
 nvarchar(max) 1字元 2Byte
變動長度 max=2GB
 1 ~ 2^30 -1 字元 所有的文字都用2 Byte來儲存
輸入的數據長度沒有達到指定的長度時不會在後面填充空格。
 ntext 1字元 2Byte
變動長度 max=2GB
 1 ~ 2^30 -1 字元
 binary(n) 固定長度 8000 Bytes,不足自動補上 0x00
 1 ~ 8000 Bytes
 varbinary(n) 變動長度  1 ~ 8000 Bytes
 varbinary(max) 變動長度 max=2GB  1 ~ 2^31 -1 Bytes
 image 變動長度 max=2GB  1 ~ 2^31 -1 Bytes

日期 - 時間 - 貨幣 - Timestamp

資料型別 位元數 資料範圍
datatime  8 Bytes 1753/1/1 ~ 9999/12/31
ex: 2008-11-27 08:08:08.888
datatime2 6 bytes for precision less than 3.
7 bytes for precision 3 or 4.
All other precision require 8 bytes.2
0001-01-01 ~ 9999-12-31
smalldatatime  4 Bytes
1900/1/1 ~ 2079/6/6
ex: 2008-11-24 15:11
money  8 Bytes  -2^63 ~ 2^63 -1 小數4位
( -922337203685477.5808 ~ 922337203685477.5807)
smallmoney  4 Bytes
-2^31 ~ 2^31 -1 小數4位 
( -214748.3648 ~ 214748.3647) 
timestamp  8 Bytes 8 Bytes 的  16 進位值
uniqueidentifier  16 Bytes
16 Bytes 的 16 進位值

結語

這回以SQL Server的資料型別列舉出資料範圍,對於日後再選擇時就能稍微留意空間大小、資料的範圍等規劃問題。
自己在使用上則是字串nvarchar,整數int、科學數字用浮點數float、有小數的金額用decimal避免誤差、日期datetime2,就能解決大多問題。
而SQL Server沒有MySQL的boolean型態,要改用0、1去存,可以考慮tinyint。
而在不同時區的資料則是統一都用一個標準去儲存日期UTC時間,如果有機會未來會在寫一篇跨國時間可能會遇到的問題。

參考資料
https://docs.microsoft.com/zh-tw/sql/t-sql/data-types/data-types-transact-sql?view=sql-server-ver15
https://ithelp.ithome.com.tw/articles/10203456
https://blog.xuite.net/tolarku/blog/20968398-SQL+Data+Type+%E8%B3%87%E6%96%99%E5%9E%8B%E5%88%A5
https://docs.microsoft.com/en-us/sql/t-sql/data-types/datetime2-transact-sql?view=sql-server-ver15
https://ithelp.ithome.com.tw/articles/10213922
https://ithelp.ithome.com.tw/articles/10203456?sc=iThelpR
https://malagege.github.io/blog/2018/11/09/DB%E5%88%B0%E5%BA%95%E6%9C%89%E6%B2%92%E6%9C%89boolean%E5%9E%8B%E6%85%8B%E5%91%A2/