大话 char、varchar、 nchar、nvarchar之间"剪不断理还乱"的关系
char、varchar、nchar、nvarchar这四个家伙不光长得很像,它们所具有的属性也十分的相似,以至于让人感觉有种"剪不断理还乱"的感觉。其实如果了解了它们各自的特点之后,想区分它们是一件很简单的事。世界上没有完全相同的两片叶子对吧,连大自然都没办法造出完全相同的两个事物,更何况人呢对吧。好了不说废话了,言归正传,人类在发明这四个东西的时候分别赋予了它们不同的职责,下面让我们慢慢分析
这四个家伙大致可以按如下两种方式分类
1.按编码机制可以分为Unicode编码标准和非Unicode编码标准
char和varchar属于非Unicode编码标准,通常写成char(n)和varchar(n),其中0B<n<8KB,如果在声明时没有指明那么n默认为1,;
nchar和nvarchar则是Unicode编码标准,同样写成nchar(n)和nvarchar(n),0B<n<4KB,同样n的默认值也是1。
Unicode和非Unicode又有什么区别呢?
Unicode(万国码、统一码),顾名思义它是一种囊括世界上所有语言、所有符号的一种编码,Unicode编码给世界上每一个字符都分配了一个唯一的编码,用来区分彼此,因此它可以自由的跨越不同的语言不同的平台,而不需要进行编码的转换,这就很好的避免了因编码转换产生的错误。但是非Unicode也不是没有优点的,它不像Unicode那样"胸怀宽广",所以它体积就比较小,节省空间,适合那种不需要或者需要少量转换的情况,至于具体选择哪种编码,那你就得根据你的需要来定夺了。
2.按存储数据的特点可以分为定长存储和不定长存储
char和nchar属于定长存储类型,也就是说如果变量的值没有达到定义的大小那么就自动用空格不全(如果超过定义时的长度,多出来的会被截掉)。什么意思呢,举个例子吧,假如将A定义为char(10)或nchar(10),A="hello",那么A放到数据库里实际上是"hello ",空白为五个空格,看完这个小例子char和nchar的特点就了解了吧,下面我们再看另外两个;
varchar和nvarchar不定长存储类型,也就是说它们具体的大小与实际变量的大小有关,如果实际变量小于开始定义的大小那么varchar和nvarchar就会自动"缩小"(不过当实际变量大于定义的大小时,它们同样会自动将多出来的部分截掉)。
同样,定长与不定长也各有各的优缺点。定长因为其长度是固定的,所以在运行效率上比较有优势,执行速度快,但是由于它大小固定的这个原因也注定了它会造成资源浪费,而且它存储的数据一般后面都会有空格所以在读取数据的时候通常要用Trim函数处理一下,这样也给程序带来了一定的麻烦;
不定长的因为其长度可变,不会有多余的空格,所以对数据操作的代码也不用特别的处理,而且不会造成浪费,节省空间,但是由于其长度不定,就制约了它的运行速度,使得其在速率上不如定长类型。
每种类型都有自己的优点和短处,至于到底用谁,那就得根据具体的要求、具体的环境、和你所要达到的效果而定了,不是选择某一个就一定好,而选择另一个就一定差,不同的类型适合不同的情况与要求,不同的情况和要求选择不同的类型。哎!怎么说了半天跟没说一样呢,感觉都是废话啊,哈哈,其实好多事就是这样,没有对与错,只有适合不适合。总之一句话——自己看着办!