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; }
标签:
sqlserver
转 https://www.cnblogs.com/mslong/p/13787026.html
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· DeepSeek “源神”启动!「GitHub 热点速览」
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器