SQL 数据库字段 数据类型说明

SQL 数据库字段 数据类型说明

  • bit 整型 bit数据类型是整型,其值只能是0、1或空值。这种数据类型用于存储只有两种可能值的数据,如yes或者No、true或者false 、On或者off

  • int 整型 int 数据类型可以存储从-231(-2147483648)到231(2147483647)之间的整数。存储到数据库的几乎所有数值型的数据都可以用这种数据类型。这种数据类型在数据库里占4个字节

  • smallint 整型 tinyint 数据类型能存储从-215(-32768)到215(32767)之间的整数。这种数据类型对存储一些限定在特定范围内的数值非常有用。这种数据类型在数据库里占用2个字节空间

  • tinyint 整型 tiny数据类型能存储从0到255之间的整数。它在你只打算存储有限数目的数值时很有用。这种数据类型在数据库占用1个字节

  • numeric 精确数值型 numeric 数据类型与decimal 型相同

  • Decimal 精确型数值型 decimal 数据类型嫩用来存储-1038-1到1038-1 的固定精度和范围的数值型数据。使用这种数据类型时,必须指定范围和精度。范围是小数点左右所存储的数字的总位数。精度是小数点右边存储的数字的位数

  • Money 货币型 money 数据类型用来表示钱和货币值。这种数据类型能存储从-9220亿到9200亿之间的数据。精确到货币单位的万分之一

  • Float 近似数值型 float 数据类型是一种近似数值类型,供浮点数的使用。说浮点数是近似的,是因为在其范围内不是所有的数都能精确表示。浮点数可以是从-1.79E +308 到1.79E+308之间的任意数

  • Real 近似数值型 real 数据类型像浮点数一样,是近似数值类型。它可以表示数值在-3.40E+38 到3.40E+38 之间的浮点数

  • Datetime 日期时间型 datetime 数据类型用来表示日期和时间。这种数据类型存储从1753 年1月1日到9999年1月31 日间所有的日期和时间数据,精确到三百分之一秒到3.33毫秒

  • Smalldatetime 日期时间型 smalldatetime 数据类型用来表示从1900年到1月1到2079年6月6日间的日期和时间,精确到一分钟zi

  • cursor 特殊数据型 cursor 数据类型是一种特殊的数据类型,它包含一个对游标的引用。这种数据类型用在存储过程中,而且创建表时不能用

  • Timestamp 特殊数据型 timestamp 数据类型是一种特殊的数类类型,用来创建一个数据库范围内的唯一数码。一个表中只能有一个timestamp 列。每次插入或修改一行时,timestamp 列的值都会改变。尽管它的名称中有time ,但timestamp 列不是人们可识别的日期。在一个数据库里,timestamp 值是唯一的。

  • uniqueidentifier 特殊数据型 Uniqueidentifier 数据类型用来存储一个全局唯一标识符,即GUID 。GUID确实是全据唯一的。这个数几乎没有机会在另一个系统中被重建。可以使用NEWID函数或转换一个字符串为唯一标识符来初始化具有有唯一标识符的列

  • char 字符型 char 数据类型用来存储指定长度的定长非统一编码型的数据。当定义一列为此类型时,你必须指定列长。当你总能知道要存储的数据的长度时,此数据类型很有用。例如,当你按邮政编码加4个字符格式来存储数据时,你知道总要用到10个字符。此数据类型的列宽最大为8000个字符

  • varchar 字符型 varchar 数据类型,同char 类型一样,用来存储非统一编码型字符数据。与char 型不一样,此数据类型为变长。当定义一列为该数据类型时,你要指定该列的最大长度。它有char 数据类型最大的区别是,存储的长度不是列长,而是数据长度

  • text 字符型 text 数据类型用来存储大量的非统一编码型字符数据。这种数据类型最多可以有231-1 或20亿个字符

  • nchar 统一编码字符型 nchar 数据类型用来存储定长统一编码字符数据。统一编码用双字节结构来存储每个字符,而不是用单字节(普通文本中的情况)。它允许大量的扩展字符。此数据类型能存储4000种字符使用的字节空间上增加了一倍

  • nvarchar 统一编码字符型 nvachar 数据类型用作变长的统一编码字符型数据。此数据类型能存储4000种字符,使用的字节空间增加了一倍

  • Ntext 统一编码字符型 ntext 数据类型用来存储大量的统一编码字符型数据。这种数据类型能存储 230-1 或将近10亿个字符,且使用的字节空间增加了一倍

  • Binary 二进制数据类型 binary 数据类型用来存储可达8000字节长的定长二进制数据。当输入表的内容接近相同的长度时,你应该使用这种数据类型。

  • varbinary 二进制数据类型 varbinary 数据类型用来存储可达8000字节长的变长的二进制数据。当输入表的内容的大小可变时,你应该使用这种数据。

  • image 二进制数据类 image 数据类型用来存储变长的二进制数据,最大可达231-1 或大约20亿字节

    (1)char 、varchar 、text和nchar、nvarchar、ntext

    char 和varchar 的长度都在1到8000之间,他们的区别在于char 是定长字符数据,而varchar 是变长字符数据。所谓定长就是长度固定的,当输入的数据长度没有达到指定的长度时将自己以英文空格在其后填充,使长度达到相应的长度;而变长字符数据则不会以空格填充,text 存储可变长度的非Unicode 数据,最大长度为2^31-1 (2147483647)个字符

后面三种数据类型和前面的相比,从名称上看只是多了个字母n ,它表示存储的是unicode 数据类型的字符。写过程序的朋友读unicode 应该比较了解。字符中,英文字符只需要一个字节存储就足够了,但汉字众多,需要两个字节存储、英文与汉字同时存在时容易造成混乱、UnIcode字符集就是为了解决字符集这种不兼容的问题而产生的,它所有的字符都用两个字节表示,即英文字符也是用两个字节表示。nchar、nvarchar 的长度是在1到4000之间。和char 、varchar比较;nchar 、nvarchar 则最多存储4000个字符,不论是英文还是汉字;而char 、varchar 最多能存储8000个英文,4000个汉字。可以看出使用nchar、nvarchar 数据类型时不用担心输入的字符是英文还是汉字,较为方便,但在存储英文时数量上有写损失。

(2)datetime 和smalldatetime

datetime :从1753年1月1日到9999年12月31日的日期和时间数据,精确到百分之三秒。

smalldatetime:从1900年1月1日到2079年6月6日的日期和时间数据,精确到分钟

(3)bitint 、int、smallint 、tinyint 和bit

bigint:从-2^63 (9223372036854775808)到2^63-1 (9223372036854775807) 的整型数据。

int:从-2^31 (-2147483648)到 2^31-1(2147483647) 的整型数据

smallint : 从-215(32768)到215-1(32767) 的整型数据

tinyint: 从0到255 的整数数据

bit : 从1或0的整数数据

(4)decimal 和numeric

这两种数据类型是的等效的,都有两个参数:p(精度)和s(小数位数)。p 指定小数点左边和右边可以存储的十进制数字的最大个数,p必须是从0到p 之间的值,默认小数位数是0.

(5)float 和real

float :从-1.79^308 到1.79^308 之间的浮点数字数据

real :从-3.40^38 到3.40^38之间的浮点数字数据。在SQL Server 中,real 的同义词为float (24)

数据库定义到char 类型的字段时,不知道大家是否会犹豫一下,到底选char 、nchar 、varchar 、nvarchar 、text 、ntext 中那一种呢?结果很可能是两种,一种是节俭人士的选择;最好是用定长的,感觉比变长能省些空间,而且处理起来会快些,无法定长只好选用定长,并且将长度设置尽可能地小;另一种是则是觉得无所谓 ,尽量用可变类型地,长度尽量放大些。

注意 :

1、当使用非unicode 时慎用以下这种查询:

select f from t where f =M ‘xx’

原因:无法利用到索引,因为数据库会将f 先转换到unicode 再和N’xx‘比较

2、 char 和相同长度的varchar 处理速度差不多(后面还会说明)

3、varchar 的长度不会影响处理速度差不多(后面还会有说明)

4、索引中列总长度最多支持总为900字节,所以长度大于900的varchar 、char 和大于450 的nvachar 、nchar 将无法创建索引

5、text 、ntext 上是无法创建索引的4

6、OR Mapping 中对应实体的属性类型一般是以string 居多,用char[] 的非常少,所以如果按mapping 的合理性来说,可变长度的类型更加吻合

7、一般基础资料表中的name 在实际查询中基本上全部是使用like ‘%xx%’ 这种方式,而这种方式是无法利用索引的,所以如果对于此种字段,索引建了也是白建

8、其它一些像remak 的字段则是根本不需要查询的,所以不需要索引

9、varchar 的存放和string 是一样原理的,即length {block}这种方式,所以varchar 的长度和它实际占用的空间是无关的

10、对于固定长度的字段,是需要额外空间来存放NULl标识的,所以如果i一个char 字段种出现非常多的NULL,那么很不幸,你的占用空间比没有NULL的大(但这个大并不是太太多,因为NULL标识是用比bit 存放的,可是如果你一行中只有你一个NULL需要标识,那么你白白浪费1byte 空间了),这个时候,你可以使用特殊标识来存放,如,“NV”

11、同上,所以对于这个NULL查询,索引是无法生效的,假如你使用了NULL标识替代的话,那么恭喜你,你可以使用到索引了。

12、char 和varchar 的比较成本是一样的,现在的关键字就看它们的索引查找的成本了,因为查找策略都一样,因此应该比较难占用空间小。在存放相同数量的字符情况下,如果数量小 ,那么char 占用长度是小于varchar 的,但如果数量稍大,则varchar 完全可能小于char ,而且要看实际填充数值的充实度,比如说varchar(3)和char(3),那么理论上应该是char 块了,但如果是char (10)和varchar(10)和varchar(10),充实度只有30%的情况下,理论上就应该是varchar 块了。因为varchar 需要额外空间存放块长度,所以只要lenth(1-fillfactor) 大于这个存放空间(好像是2字节),那么它就会比相同长度的char 块了。

13、nvarchar比varchar 更慢上一些,而且对于非unicode 字符它会占用双倍的空间,那么一种类型推出来是为什么呢?对,就是为了国际化,对于unicode 类型的数据,排序规则对它们是不起作用的,而非unicode 字符在处理不同语言的数据时,必须指定排序规则才能正常工作,所以n类型就这么一点好处。

总结:

1、如果数据量非常大,又能100%确定长度且保存只是ansi字符,那么用char

  1. 能确定长度又不一定是ansi 字符,那么用nchar
  2. 不确定长度,要查询且希望利用索引的话,用nvarchar 类型,将他们设到400.

查询中基本上是使用like ’%xx%‘这种方式,而这种方式是无法利用索引的,所以如果对于此种字段,索引建了也是白

猜你喜欢

转载自blog.csdn.net/weixin_43501566/article/details/106989303