char,varchar与nvarchar

ASCII编码与Unicode编码

在区分char,varchar与nvarchar之前我们先来了解一下计算机中常用的两种编码方式即:ASCII编码与Unicode编码。

因为计算机是有美国人发明的,他们用8个可以开合的晶体管来组合成不同的状态,于是他们把这称为”字节“,八位的字节一共可以组合出256(2的8次方)种不同的状态。。在美国人的单词是由二十六个英文字母构成,加上一些数字,叫得上和叫不上的字符。所以最早只有127个字母被编码到计算机里这个编码表被称为ASCII编码,比如大写字母A的编码是65,小写字母z的编码是122。

再后来一些别的国家的各种符号,无法用现有的ascii编码表示,所以有了”扩展字符集“,也就是说将这些原本表中没有的符号填充到128到255位。

编码应运而生。一个叫 ISO(国际标谁化组织)的国际组织决定着手解决这个问题。他们采用的方法很简单:废了所有的地区性编码方案,重新搞一个包括了地球上所有文化、所有字母和符号 的编码!叫它”Universal Multiple-Octet Coded Character Set”,简称 UCS, 俗称 “unicode“。Unicode把所有语言都统一到一套编码里,这样就不会再有乱码问题了。也就是说从unicode开始,无论是半角的英文字母,还是全角的汉字,它们都是统一的”一个字符“!同时,也都是统一的”两个字节“,请注意”字符”和”字节”两个术语的不同,“字节”是一个8位的物理存贮单元,而“字符”则是一个文化相关的符号。在unicode中,一个字符就是两个字节,另外如果要用到非常偏僻的字符,就需要4个字节。而这个时候计算机已经得到了有效地发展,物理空间大大扩充,也支持unicode。

详:https://www.zhihu.com/question/23374078

char ,varchar和nvarchar

char是定长的,也就是无论你输入的字符多长,它都是制定的数目的长度。例如char(5),你输入的字符小于5,它会在后面补空值。当你输入的字符大于指定的数时,它会截取超出的部分。 

varchar(n),可变长度,非Unicode字符数据。n的取值范围为1至8000。存储大小为输入数据的字节的实际长度,而不是n个字节。所输入的数据字符长度可以为0。

nvarchar(n),包含n个字节的可变长度Unicode字符数据。n的取值范围为1到4000.字节的存储大小是所输入字符个数的两倍。所输入的数据字符长度可以为0.

从效率上说:char是定长存储数据的,索引效率最高。

从空间上说:varchar可以识别出存储需要的空间并加以分配,但是效率不如char。

字符中,英文字符只需要一个字节存储就足够了,但汉字众多,需要两个字节存储,英文与汉字同时存在时容易造成混乱,nvarchar就是来解决这个问题的,它无论是英文还是汉字都是用两个字节来表示的。所以它最多能存储4000个字符,汉字和英文都一样,占用一样的空间。所以在存储上会造成一定浪费。

如果字符中含有中文字符,就用nvarchar,如果是纯英文和数字的,那么就选用char/varchar。

猜你喜欢

转载自www.cnblogs.com/welan/p/9168446.html