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

 

posted @ 2020-10-09 17:32  人生黑色  阅读(3635)  评论(0编辑  收藏  举报