為了能夠讓每種資料有比較好的儲存方式,所以這回來看一下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 |
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/