以下是 SQL Server 中常見的數據類型及其詳細解釋、內存占用和適用場景:
| 數據類型類別 | 數據類型 | 解釋 | 內存占用 | 適用場景 |
|---|---|---|---|---|
| 整數類型 | bigint | 用于存儲范圍較大的整數,范圍是 -2^63 (-9,223,372,036,854,775,808) 到 2^63-1 (9,223,372,036,854,775,807) | 8 字節 | 需要存儲非常大整數的場景,如統計海量數據的數量等。 |
int | 常用的整數類型,范圍是 -2^31 (-2,147,483,648) 到 2^31-1 (2,147,483,647) | 4 字節 | 一般整數存儲場景,如用戶 ID、商品數量等。 | |
smallint | 范圍是 -2^15 (-32,768) 到 2^15-1 (32,767) | 2 字節 | 存儲較小范圍整數的場景,如表示月份(1 - 12)等。 | |
tinyint | 無符號整數,范圍是 0 到 255 | 1 字節 | 存儲非常小的正整數,如年齡(一般不會超過 255)等。 | |
| 精確數值類型 | decimal(p, s)numeric(p, s) | p 表示精度(總位數),s 表示小數位數。可精確存儲小數,范圍從 -10^38 +1 到 10^38 - 1。例如 decimal(5, 2) 可存儲如 123.45 這樣的數。 | p <= 9 時占 5 字節;9 < p <= 19 時占 9 字節;19 < p <= 28 時占 13 字節;28 < p <= 38 時占 17 字節 | 需要精確計算小數的場景,如財務數據計算,貨幣金額存儲等。 |
| 近似數值類型 | float(n) | n 表示精度,n 為 1 - 24 時相當于 float(24),使用 4 字節;n 為 25 - 53 時相當于 float(53),使用 8 字節。可表示范圍約為 -1.79E + 308 到 1.79E + 308 | 4 字節(n 為 1 - 24)或 8 字節(n 為 25 - 53) | 不需要精確計算的浮點數存儲場景,如科學計算中的近似值。 |
real | 單精度浮點數,范圍約為 -3.40E + 38 到 3.40E + 38 | 4 字節 | 對精度要求不高的浮點數存儲,如一些統計數據的近似值。 | |
| 日期和時間類型 | date | 僅存儲日期,范圍從 0001 - 01 - 01 到 9999 - 12 - 31 | 3 字節 | 只需要存儲日期信息的場景,如生日、訂單日期等。 |
time | 僅存儲時間,精度可到 100 納秒,范圍從 00:00:00.0000000 到 23:59:59.9999999 | 3 - 5 字節(根據精度) | 只需要存儲時間信息的場景,如會議時間、營業時間等。 | |
datetime | 存儲日期和時間,范圍從 1753 - 01 - 01 00:00:00 到 9999 - 12 - 31 23:59:59,精度為 3.33 毫秒 | 8 字節 | 同時需要日期和時間信息,且對精度要求不是特別高的場景。 | |
datetime2 | 相比 datetime 有更高的精度,范圍從 0001 - 01 - 01 00:00:00 到 9999 - 12 - 31 23:59:59.9999999,精度可到 100 納秒 | 6 - 8 字節(根據精度) | 需要更高精度日期和時間存儲的場景。 | |
smalldatetime | 存儲日期和時間,范圍從 1900 - 01 - 01 00:00:00 到 2079 - 06 - 06 23:59:59,精度為 1 分鐘 | 4 字節 | 對日期和時間范圍要求較小,且精度要求不高的場景。 | |
datetimeoffset | 存儲日期、時間和時區偏移量,范圍從 0001 - 01 - 01 00:00:00 到 9999 - 12 - 31 23:59:59.9999999,精度可到 100 納秒 | 8 - 10 字節(根據精度) | 涉及不同時區日期和時間存儲的場景。 | |
| 字符串類型 | char(n) | 固定長度的字符串,n 表示字符串長度,范圍是 1 - 8000。如果存儲的字符串長度小于 n,會用空格填充。 | n 字節 | 存儲長度固定的字符串,如身份證號碼(固定 18 位)等。 |
varchar(n) | 可變長度的字符串,n 表示最大長度,范圍是 1 - 8000。只占用實際存儲字符串的長度加 2 字節(用于記錄長度)。 | 實際字符串長度 + 2 字節 | 存儲長度可變的字符串,如用戶名、地址等。 | |
text | 用于存儲大量文本數據,最大長度為 2^31 - 1(2,147,483,647)個字符。 | 實際字符串長度 + 4 字節 | 存儲較長的文本內容,如文章內容、備注信息等,但從 SQL Server 2016 開始不推薦使用,建議用 varchar(max) 替代。 | |
varchar(max) | 可變長度的字符串,最大長度為 2^31 - 1(2,147,483,647)個字符。 | 實際字符串長度 + 2 字節(長度小于 8000 時)或 4 字節(長度大于 8000 時) | 存儲非常長的可變長度字符串,如大型文檔等。 | |
| Unicode 字符串類型 | nchar(n) | 固定長度的 Unicode 字符串,n 表示字符串長度,范圍是 1 - 4000。每個字符占 2 字節。 | 2 * n 字節 | 存儲固定長度的 Unicode 字符串,如一些多語言環境下固定長度的名稱。 |
nvarchar(n) | 可變長度的 Unicode 字符串,n 表示最大長度,范圍是 1 - 4000。只占用實際存儲字符串的長度加 2 字節(用于記錄長度),每個字符占 2 字節。 | 2 * 實際字符串長度 + 2 字節 | 存儲可變長度的 Unicode 字符串,適用于多語言環境下的用戶名、描述等。 | |
ntext | 用于存儲大量 Unicode 文本數據,最大長度為 2^30 - 1(1,073,741,823)個字符。 | 2 * 實際字符串長度 + 4 字節 | 存儲較長的 Unicode 文本內容,但從 SQL Server 2016 開始不推薦使用,建議用 nvarchar(max) 替代。 | |
nvarchar(max) | 可變長度的 Unicode 字符串,最大長度為 2^31 - 1(2,147,483,647)個字符。每個字符占 2 字節。 | 2 * 實際字符串長度 + 2 字節(長度小于 4000 時)或 4 字節(長度大于 4000 時) | 存儲非常長的可變長度 Unicode 字符串,適用于多語言環境下的大型文檔等。 | |
| 二進制類型 | binary(n) | 固定長度的二進制數據,n 表示長度,范圍是 1 - 8000。如果存儲的二進制數據長度小于 n,會用 0x00 填充。 | n 字節 | 存儲固定長度的二進制數據,如加密密鑰等。 |
varbinary(n) | 可變長度的二進制數據,n 表示最大長度,范圍是 1 - 8000。只占用實際存儲二進制數據的長度加 2 字節(用于記錄長度)。 | 實際二進制數據長度 + 2 字節 | 存儲可變長度的二進制數據,如圖片、文件等較小的二進制對象。 | |
image | 用于存儲大量二進制數據,最大長度為 2^31 - 1(2,147,483,647)字節。 | 實際二進制數據長度 + 4 字節 | 存儲較大的二進制對象,如大型圖片、視頻等,但從 SQL Server 2016 開始不推薦使用,建議用 varbinary(max) 替代。 | |
varbinary(max) | 可變長度的二進制數據,最大長度為 2^31 - 1(2,147,483,647)字節。 | 實際二進制數據長度 + 2 字節(長度小于 8000 時)或 4 字節(長度大于 8000 時) | 存儲非常大的可變長度二進制數據,如大型文件、高清視頻等。 | |
| 其他類型 | bit | 只能存儲 0、1 或 NULL,用于表示布爾值 | 1 字節 | 表示布爾類型的數據,如是否啟用、是否刪除等。 |
uniqueidentifier | 存儲全局唯一標識符(GUID),是一個 16 字節的二進制數據 | 16 字節 | 用于在分布式系統中唯一標識記錄,如在多個數據庫之間同步數據時作為唯一標識。 | |
xml | 用于存儲 XML 數據 | 實際 XML 數據長度 + 額外開銷 | 存儲和處理 XML 格式的數據,如配置文件、數據交換等。 |