首页 > 代码库 > 数据库基本经常使用类型解析

数据库基本经常使用类型解析

int、bigint、smallint 和 tinyint
使用整数数据的精确数字数据类型。
bigint
从 -2^63 (-9223372036854775808) 到 2^63-1 (9223372036854775807) 的整型数据(全部数字)。

存储大小为 8 个字节。


int
从 -2^31 (-2,147,483,648) 到 2^31 - 1 (2,147,483,647) 的整型数据(全部数字)。存储大小为 4 个字节。int 的 SQL-92 同义字为 integer。


smallint
从 -2^15 (-32,768) 到 2^15 - 1 (32,767) 的整型数据。

存储大小为 2 个字节。
tinyint
从 0 到 255 的整型数据。存储大小为 1 字节。
凝视
在支持整数值的地方支持 bigint 数据类型。可是,bigint 用于某些特殊的情况,当整数值超过 int 数据类型支持的范围时,就能够採用 bigint。

在 SQL Server 中,int 数据类型是基本的整数数据类型。


在数据类型优先次序表中,bigint 位于 smallmoney 和 int 之间。
仅仅有当參数表达式是 bigint 数据类型时,函数才返回 bigint。SQL Server 不会自己主动将其他整数数据类型(tinyint、smallint 和 int)提升为 bigint。

char、varchar、nchar、nvarchar类型解说:

一、基本差别:

1、char、varchar

char(n):  定长数据类型,n为能存储的最大字节长度(取值范围1~8000),当存入字符数少于n的时候,末尾用空格不足。

当存入字符数超过n的时候,数据库阶段n之后的字符截断。

varchar(n): 变长数据类型,n为能存储的最大字节长度(取值范围1~8000)。当存储字符占用字节少于n时,以实际使用为准;超过n时,截断。

这里为什么说n是来限定存储的字节呢?

原因在于当使用char或varchar来存储数据是:字符为由于字符,占一个字节。字符中文字符时,一个中文字符普通情况下占两个字节。要存入的字符为中英文混合时。按实际使用的字节计算。如‘中文ABC’存储占用字节为:2*2+3:。以下举个样例:

declare @var1 varchar(6), @var2 varchar(5);

set @var1=‘中文AB‘;

set @var2=‘中文AB‘;

select @var1, @var2;

运行结果例如以下:

|   未知列1    |    未知列2    |

---------------------------------------

|   中文AB     |    中文A       |

原因在于“中文AB”使用varchar类型来存储时占用字节为:2*2+2=6。 第二个varchar(5)限定了最长为5个字节所以会把超出部分截断,既‘B’丢失。

 

2、ncahr、nvarchar

nchar(n):  定长数据类型。存储字符为Unicode编码类型,每一个字符占两个字节,n为能存储的最大字符数(取值范围1~4000【想想最大值为什么是4000?】),当存入字符数少于n的时候,末尾用空格不足。当存入字符数超过n的时候。数据库阶段n之后的字符。

nvarchar(n): 变长数据类型,存储字符为Unicode编码类型,每一个字符占两个字节,n为能存储的最大字符数(取值范围1~4000),当存储字符占用字节少于n时,以实际使用为准;超过n时,截断。

相同以一个样例来说明,nvarchar(n)括号里的n指的是字符限定数。

declare @var1 nvarchar(4), @var2 nvarchar(3);

set @var1=‘中文AB‘;

set @var2=‘中文AB‘;

select @var1, @var2;

运行结果例如以下:

|   未知列1    |    未知列2    |

---------------------------------------

|   中文AB      |    中文A     |

 

二、使用情况:

【本段摘自http://www.cnblogs.com/ebaidu/archive/2007/08/14/854778.html仅供学习使用】

非常多开发人员进行数据库设计的时候往往并没有太多的考虑char, varchar类型,有的是根本就没注意,由于存储价格变得越来越廉价了,忘记了最開始的一些基本设计理论和原则,这点让我想到了如今的年轻人,大手一挥一把人民币就从他手里溜走了。事实上我想无论是做人也好。做开发也好,细节的把握直接决定非常多东西。当然另一部分人是根本就没弄清楚他们的差别,也就随便选一个。在这里我想对他们做个简单的分析。当然假设有不正确的地方希望大家不吝赐教。

1、CHAR。CHAR存储定长数据非常方便,CHAR字段上的索引效率级高,比方定义char(10),那么不论你存储的数据是否达到了10个字节。都要占去10个字节的空间,不足的自己主动用空格填充,所以在读取的时候可能要多次用到trim() 。

2、VARCHAR。

存储变长数据 。但存储效率没有CHAR高。 假设一个字段可能的值是不固定长度的,我们仅仅知道它不可能超过10个字符,把它定义为 VARCHAR(10)是最合算的。

VARCHAR类型的实际长度是它的值的实际长度+1。为什么“+1”呢?这一个字节用于保存实际使用了多大的长度。

从空间上考虑。用varchar合适;从效率上考虑。用char合适。关键是依据实际情况找到权衡点。

3、TEXT。text存储可变长度的非Unicode数据,最大长度为2^31-1(2,147,483,647)个字符。

4、NCHAR、NVARCHAR、NTEXT。

这三种从名字上看比前面三种多了个“N”。它表示存储的是Unicode数据类型的字符。我们知道字符中。英文字符仅仅须要一个字节存储就足够了,但汉字众多,须要两个字节存储,英文与汉字同一时候存在时easy造成混乱。Unicode字符集就是为了解决字符集这样的不兼容的问题而产生的,它全部的字符都用两个字节表示,即英文字符也是用两个字节表示。 nchar、 nvarchar的长度是在1到4000之间。

和char、varchar比較起来。nchar、nvarchar则最多存储4000个字符,不论是英文还是汉字;而char、varchar最多能存储8000个英文,4000个汉字。能够看出使用nchar、nvarchar数据类型时不用操心输入的字符是英文还是汉字,较为方便,但在存储英文时数量上有些损失。

 

补充:char(n)在读取是知道字符串的长度,能够一次读出。而varchar(n)就像C语言中的字符串处理方式一样,在末尾用‘\0‘来表示结尾。所以不能一次性读出。须要一个一个字符读出才干知道在哪里结束。

所以char类型的读取速度比varchar类型的读取速度快。


所以一般来说。假设含有中文字符,用nchar/nvarchar,假设纯英文和数字,用char/varchar
我把他们的差别概括成:
CHAR, NCHAR 定长,速度快,占空间大。需处理
VARCHAR。NVARCHAR。TEXT 不定长,空间小,速度慢,无需处理
NCHAR、NVARCHAR、NTEXT处理Unicode码

【本段摘自http://wenku.baidu.com/view/eee97bf5f61fb7360b4c652b.html仅供学习使用】

varchar在SQL Server中是採用单字节来存储数据的,nvarchar是使用Unicode来存储数据的.中文字符存储到SQL Server中会保存为两个字节(一般採用Unico编码)。英文字符保存到数据库中,假设字段的类型为varchar,则仅仅会占用 一个字节 。而假设字段的类型为nvarchar。则会占用 两个字节 .
  正常情况下,我们使用varchar 也能够存储中文字符 ,可是假设遇到操作系统是英文操作系统并且对中文字体的 支持不全面时 , 在SQL Server存储中文字符为varchar就会出现乱码(显示为?

?).并且正常情况下。主机都会支持中文的环境,所以假设使用varchar来存储数据。在开发阶段是发现不了的.多数情况下,在布署的时候也不会有问题.
  可是!

假设布署的主机是英文操作系统,并且不支持中文环境,那问题就出来了.全部的varchar字段在存储中文的时候都会变成乱码(显示为??).并且普通情况下你不会知道这是由于你採用了错误的数据类型来存储所造成的,你会试着去装中文字体,试着去设置操作系统的语言环境...这些都不能解决这个问题,唯一能解决这个问题的是把数据库字段的类型个性为nvarchar(或者nchar).对项目管理比較熟悉的朋友应该都知道,到布署阶段再来改动数据库是一个非常恐怖的事情.
  使用nvarchar的还有一个很优点就是在推断字符串的时候能够不须要考虑中英文两种字符的区别.
  当然,使用nvarchar存储英文字符会增大一倍的存储空间.可是在存储代价已经非常低廉的情况下。优先考虑兼容性会给你带来很多其它优点的.
  所以在Design的时候应该尽量使用nvarchar来存储数据.仅仅有在你确保该字段不会保存中文的时候,才採用varchar来存储.

补充:varchar(n)和nvarchar(n)都能处理中文,可是有些细节须要注意:当遇到中英文混合的情况时。varchar类型读取时会每一个字节去推断究竟是一个英文字符还是等待和下一个字节一起解析为一个中文字符,而nvarchar则不用,直接每次两个字节一起解析为一个Unicode字符。速度自己去体会了。

 

------------------------------------------------------------------------------------------------------------------------

总结:

1、varchar(n)括号里n限定的是能存储的最大字节数,nvarchar(n)括号里n限定的是能存储的最大字符数。

2、varchar和nvarcahr使用情形:在字符中全是英文时使用varchar。全是中文是使用nvarchar,中英文混合时推荐使用nvarchar。

3、char和varchar使用情形:注重读取效率时使用char(注意使用过程中要去除末尾空格)。注重使用空间时使用varchar。

数据库基本经常使用类型解析