SQL Server 常用數據類型
Character 字符串:
數據類型
|
描述
|
存儲長度(字符數)
|
對應C#類型
|
char(n)
|
固定長度的字符串。最多 8,000 個字符。
|
n <= 8000字符
|
String
|
varchar(n)
|
可變長度的字符串。最多 8,000 個字符。
|
0-n字符
|
String
|
varchar(max)
|
可變長度的字符串。最多 1,073,741,824 個字符。
|
0-max字符
|
String
|
text
|
可變長度的字符串。最多 2GB 字符數據。
|
0-2GB字符
|
String
|
Unicode 字符串:
數據類型
|
描述
|
存儲長度(字符數)
|
對應C#類型
|
nchar(n)
|
固定長度的 Unicode 數據。最多 4,000 個字符。
|
n <=4000字符
|
String
|
nvarchar(n)
|
可變長度的 Unicode 數據。最多 4,000 個字符。
|
0-n <=4000
|
String
|
nvarchar(max)
|
可變長度的 Unicode 數據。最多 536,870,912 個字符。
|
0-536,870,912
|
String
|
ntext
|
可變長度的 Unicode 數據。最多 2GB 字符數據。
|
0-2GB字符
|
String
|
字符集說明:
1、字符中,英文字符只需要一個字節存儲就足夠了,但漢字眾多,需要兩個字節存儲,英文與漢字同時存在時容易造成混亂;
2、Unicode字符集是為了解決字符集這種不兼容的問題而產生的,它所有的字符都用兩個字節表示,即英文字符也是用兩個字節表示。
特別說明(varchar和nvarchar的區別):
1、varchar在SQL Server中是采用單字節來存儲數據的,nvarchar是使用Unicode雙字節來存儲數據的.
2、英文字符占一個字節,在存儲時,如果字段類型是varchar,則只會占用一個字節,而如果字段的類型為nvarchar,則會占用兩個字節.
中文字符占兩個字節,在存儲時,不管字段類型是varchar,還是nvarchar,都占用兩個字節(一般采用Unicode編碼)。
3、正常情況下varchar也可存儲中文字符,但是如果遇到操作系統是英文操作系統,且對中文字體的支持不全面時, 在SQL Server存儲中文字符為varchar就會出現亂碼(顯示為??);
唯一能解決問題辦法的是把數據庫字段的類型更改為nvarchar(或 者nchar)。
4、使用nvarchar類型,即可解決字符集兼容性問題(不用擔心中文亂碼問題),又可在判斷字符串時不需要考慮中英文兩種字符的差別.缺點是會增大一倍的存儲空間。
5、所以一般來說,如果可能含有中文字符,用nchar/nvarchar存儲,如果純英文和數字(保證不含中文),則用char/varchar存儲。
6、另外需要補充下,使用varchar存儲字段,很可能會導致隱式轉換;
注:Unicode (統一碼、 萬國碼、單一碼 )是一種在計算機上使用的字符編碼 。它為每種語言中的每個字符設定了統一並且唯一的二進制編碼 ,以滿足跨語言、跨平台進行文本轉換 、處理的要求。
實例如下:創建AAA表,並插入1000條測試數據,並在name1上建索引,然后分別執行以下兩行SQL語句,查看執行計划,發現第二個多了constant Scan的開銷。
DECLARE @name VARCHAR(100) SET @name = '張三500' SELECT * FROM AAA WHERE name1 = @name --varchar存儲,參數類型為varchar,不存在隱式轉換
DECLARE @name NVARCHAR(100) SET @name = '張三500' SELECT * FROM AAA WHERE name1 = @name --varchar存儲,參數類型為nvarchar,存在隱式轉換
注:有時會出現,使用了nvarchar數據類型,但是系統仍出現中文亂碼或者特殊符號亂碼的問題;這時候在更新或者插入的字段值前面加上N即可;(如果是varchar類型的,加上N也不好使的)。
那么這個N是干什么用的呢?字符串參數值的前面有一個大寫的N,它的含義是表明后面引號里的字符串是unicode。
總結一下:1、中文亂碼問題,首先保證列的類型是nvarchar;2、然后插入數據的時候用“N”保證數據是unicode的。 這樣就不會顯示莫名其妙的問號、中文亂碼或者特殊符號亂碼了。
Binary 類型:
數據類型
|
描述
|
存儲長度(字符數)
|
對應C#類型
|
bit
|
允許 0、1 或 NULL
|
1 字節
|
bool
|
binary(n)
|
固定長度的二進制數據。最多 8,000 字節。
|
n <= 8000字節
|
Object
|
varbinary(n)
|
可變長度的二進制數據。最多 8,000 字節。
|
0-n字節
|
Object
|
varbinary(max)
|
可變長度的二進制數據。最多 2GB 字節。
|
0-2GB字節
|
Object
|
image
|
可變長度的二進制數據。最多 2GB。
|
0-2GB字節
|
Object
|
Number 類型:
數據類型
|
描述
|
存儲長度(字符數)
|
對應C#類型
|
tinyint
|
允許從 0 到 255 的所有數字。
|
1 字節
|
byte
|
smallint
|
允許從 -32,768 到 32,767 的所有數字。
|
2 字節
|
short
|
int
|
允許從 -2,147,483,648 到 2147483647 的所有數字。
|
4 字節
|
int
|
bigint
|
允許介於 -9,223,372,036,854,775,808 和 9,223,372,036,854,775,807 之間的所有數字。
|
8 字節
|
long
|
decimal(p,s)
|
固定精度和比例的數字。允許從 -10^38 +1 到 10^38 -1 之間的數字。
p 參數指示可以存儲的最大位數(小數點左側和右側)。p 必須是 1 到 38 之間的值。默認是 18。
s 參數指示小數點右側存儲的最大位數。s 必須是 0 到 p 之間的值。默認是 0。
|
5-17 字節
|
decimal(p,s)
|
numeric(p,s)
|
固定精度和比例的數字。允許從 -10^38 +1 到 10^38 -1 之間的數字。
p 參數指示可以存儲的最大位數(小數點左側和右側)。p 必須是 1 到 38 之間的值。默認是 18。
s 參數指示小數點右側存儲的最大位數。s 必須是 0 到 p 之間的值。默認是 0。
|
5-17 字節
|
numeric(p,s)
|
smallmoney
|
介於 -214,748.3648 和 214,748.3647 之間的貨幣數據。
|
4 字節
|
decimal
|
money
|
介於 -922,337,203,685,477.5808 和 922,337,203,685,477.5807 之間的貨幣數據。
|
8 字節
|
decimal
|
float(n)
|
從 -1.79E + 308 到 1.79E + 308 的浮動精度數字數據。 參數 n 指示該字段保存 4 字節還是 8 字節。float(24) 保存 4 字節,而 float(53) 保存 8 字節。n 的默認值是 53。
|
4 或 8 字節
|
double
|
real
|
從 -3.40E + 38 到 3.40E + 38 的浮動精度數字數據。
|
4 字節
|
float/Single
|
Date 類型:
數據類型
|
描述
|
存儲長度(字符數)
|
對應C#類型
|
datetime
|
從 1753 年 1 月 1 日 到 9999 年 12 月 31 日,精度為 3.33 毫秒。
|
8 bytes
|
DateTime
|
datetime2
|
從 1753 年 1 月 1 日 到 9999 年 12 月 31 日,精度為 100 納秒。
|
6-8 bytes
|
|
smalldatetime
|
從 1900 年 1 月 1 日 到 2079 年 6 月 6 日,精度為 1 分鍾。
|
4 bytes
|
DateTime
|
date
|
僅存儲日期。從 0001 年 1 月 1 日 到 9999 年 12 月 31 日。
|
3 bytes
|
|
time
|
僅存儲時間。精度為 100 納秒。
|
3-5 bytes
|
|
datetimeoffset
|
與 datetime2 相同,外加時區偏移。
|
8-10 bytes
|
|
timestamp
|
存儲唯一的數字,每當創建或修改某行時,該數字會更新。timestamp 基於內部時鍾,不對應真實時間。每個表只能有一個 timestamp 變量。
|
8 bytes
|
Object
|
其他數據類型:
數據類型
|
描述
|
存儲長度(字符數)
|
對應C#類型
|
sql_variant
|
存儲最多 8,000 字節不同數據類型的數據,除了 text、ntext 以及 timestamp。
|
|
Object
|
uniqueidentifier
|
存儲全局標識符 (GUID)。
|
|
Guid
|
xml
|
存儲 XML 格式化數據。最多 2GB。
|
|
Object
|
cursor
|
存儲對用於數據庫操作的指針的引用。
|
|
|
table
|
存儲結果集,供稍后處理。
|
|
|
SQL Server類型
|
C#類型
|
bit
|
bool
|
tinyint
|
byte
|
smallint
|
short
|
int
|
int
|
bigint
|
long
|
real
|
float
|
float
|
double
|
money
|
decimal
|
decimal
|
decimal
|
datetime
|
DateTime
|
char
|
string
|
varchar
|
string
|
nchar
|
string
|
nvarchar
|
string
|
text
|
string
|
ntext
|
string
|
image
|
byte[]
|
binary
|
byte[]
|
uniqueidentifier
|
Guid
|
// sqlTypeString類型轉換為SqlDbType類型 public static SqlDbType SqlTypeString2SqlType(string sqlTypeString) { SqlDbType dbType = SqlDbType.Variant;//默認為Object switch (sqlTypeString) { case "int": dbType = SqlDbType.Int; break; case "varchar": dbType = SqlDbType.VarChar; break; case "bit": dbType = SqlDbType.Bit; break; case "datetime": dbType = SqlDbType.DateTime; break; case "decimal": dbType = SqlDbType.Decimal; break; case "float": dbType = SqlDbType.Float; break; case "image": dbType = SqlDbType.Image; break; case "money": dbType = SqlDbType.Money; break; case "ntext": dbType = SqlDbType.NText; break; case "nvarchar": dbType = SqlDbType.NVarChar; break; case "smalldatetime": dbType = SqlDbType.SmallDateTime; break; case "smallint": dbType = SqlDbType.SmallInt; break; case "text": dbType = SqlDbType.Text; break; case "bigint": dbType = SqlDbType.BigInt; break; case "binary": dbType = SqlDbType.Binary; break; case "char": dbType = SqlDbType.Char; break; case "nchar": dbType = SqlDbType.NChar; break; case "numeric": dbType = SqlDbType.Decimal; break; case "real": dbType = SqlDbType.Real; break; case "smallmoney": dbType = SqlDbType.SmallMoney; break; case "sql_variant": dbType = SqlDbType.Variant; break; case "timestamp": dbType = SqlDbType.Timestamp; break; case "tinyint": dbType = SqlDbType.TinyInt; break; case "uniqueidentifier": dbType = SqlDbType.UniqueIdentifier; break; case "varbinary": dbType = SqlDbType.VarBinary; break; case "xml": dbType = SqlDbType.Xml; break; } return dbType; } //SqlDbType轉換為C#數據類型 public static Type SqlType2CsharpType(SqlDbType sqlType) { switch (sqlType) { case SqlDbType.BigInt: return typeof(Int64); case SqlDbType.Binary: return typeof(Object); case SqlDbType.Bit: return typeof(Boolean); case SqlDbType.Char: return typeof(String); case SqlDbType.DateTime: return typeof(DateTime); case SqlDbType.Decimal: return typeof(Decimal); case SqlDbType.Float: return typeof(Double); case SqlDbType.Image: return typeof(Object); case SqlDbType.Int: return typeof(Int32); case SqlDbType.Money: return typeof(Decimal); case SqlDbType.NChar: return typeof(String); case SqlDbType.NText: return typeof(String); case SqlDbType.NVarChar: return typeof(String); case SqlDbType.Real: return typeof(Single); case SqlDbType.SmallDateTime: return typeof(DateTime); case SqlDbType.SmallInt: return typeof(Int16); case SqlDbType.SmallMoney: return typeof(Decimal); case SqlDbType.Text: return typeof(String); case SqlDbType.Timestamp: return typeof(Object); case SqlDbType.TinyInt: return typeof(Byte); case SqlDbType.Udt: return typeof(Object);//自定義的數據類型 case SqlDbType.UniqueIdentifier: return typeof(Object); case SqlDbType.VarBinary: return typeof(Object); case SqlDbType.VarChar: return typeof(String); case SqlDbType.Variant: return typeof(Object); case SqlDbType.Xml: return typeof(Object); default: return null; } } // sql server中的數據類型,轉換為C#中的類型類型 public static Type SqlTypeString2CsharpType(string sqlTypeString) { SqlDbType dbTpe = SqlTypeString2SqlType(sqlTypeString); return SqlType2CsharpType(dbTpe); } // 將sql server中的數據類型,轉化為C#中的類型的字符串 public static string SqlTypeString2CsharpTypeString(string sqlTypeString) { Type type = SqlTypeString2CsharpType(sqlTypeString); return type.Name; }