SQL Server 常用數據類型


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;
        }
 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM