SQL中char nchar varchar nvarchar text ntext的区别

     

类型 长度 使用说明 长度说明
char(n) 定长 索引效率高,程序里面使用trim去除多余的空白 n必须是一个介于1和8000之间的数值,存储大小为n个字节
varchar(n) 变长 效率没char高 灵活 n必须是一个介于1和8000之间的数值。存储大小为输入数据的字节的实际长度,而不是n个字节
text(n) 变长 非Unicode数据 不用指定长度
nchar(n) 定长 处理Unicode数据类型(所有的字符使用两个字节表示) n的值必须介于1和4000之间,存储大小为n字节的两倍
nvarchar(n) 变长 处理unicode数据类型(所有的字符使用两个字节表示) n的值必须介于1和4000之间。字节的存储大小是所输入字符个数的两倍。所输入的数据字符长度可以为零
ntext(n) 变长 处理unicode数据类型(所有的字符使用两个字节表示) 不用指长度

  一般来说,如果中文字符,使用nchar/nvarchar , 如果是纯英文和数字,用char/varchar

char, 存储定长的数据很方便,char字段上的索引效果高,如比定义char(10),那么不论你的存储是数据是否达到了10个字节,都要占去10个字节的空间,不足的自动用空格填充,所以在读取的时间可能要多次用到trim().

varchar. 存储变长数据,但存储效率没有char高。如果一个字段可能的值是不固定长度的,我们只知道它不可能超过10个字符,把它定义为varchar(10)是最合算的。varchart类型的实际长度是它的值的长度+1. 为什么"+1"呢? 这一个字节用于保存实际使用了多大的长度。从空间上考虑,用varchar合适;从效率上考虑,用char合适,关键是根据实际情况找到权衡点。

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

nchar, nvarchar, ntext. 这三种从名字上看比前面三种多了个“N”, 它表示存储的是Unicode数据类型的字符。我们知道字符中,英文字符只需一个字节存储就足够了,但汉字众多,需要两个字节存储,英文与汉字同时存在时容易造成混乱,Unicode字符集就是为了解决字符集这种不兼容的问题而产生的,它所有的字符都用两个字节表示,即英文字符也是用两个字节表示。nchar, nvarchar的长度是在1到4000之间。和char, varchar比较起来,nchar, nvarchar则最多存储4000个字符,不论是英文还是汉字;而char, varchar则最多能存储8000个英文,4000个汉字。可以看出使用nchar, nvarchar数据类型时不要担心输入的字符是英文还是汉字,较为方便,但在存储英文时数量上有些损失。

所以一般说来,如果含有中文字符,用nchar/nvarchar, 如果纯英文和数字,用char/varchar

它们的区别概括成:

char, nchar定长,速度快,占空间大,需处理

varchar, nvarchar, text 不定长,空间小,速度慢,无需处理

nchar, nvarchar, ntext处理Unicode码

varchar在SQL中是采用单字节来存储数据的,nvarchar是使用Unicode来存储数据的,中文字符存储到SQL中会保存为两个字节(一般采用Unico编码),英文字符保存到数据库中,如果字段的类型为varchar, 则只会占用一个字节,而如果字段的类型为nvarchar, 则会占用两个字节。

正常情况下,我们使用varchar也可以存储中文字符,但是如果遇到操作系统是英文操作系统并且对中文字体的支持不全面时,在SQL存储中文字符为varchar就会出现乱码。而且正常情况下,主要都会支持中文的环境,所以如果使用varchar来存储数据,在开发阶段是发现不了的,多数情况下,在部署。

 当然,使用nvarchar存储英文字符增大一倍的存储空间,但是在存储代价已经很低廉的情况下,优先考虑兼容性会给你带来更多好处的

所以在design时该尽量使用nvarchar来存储数据,只有在你确保该字段不会保存中文的时候,才采用varchar来存储