char(10)和nchar(10)的使用的编码不一样,而sqlserver中将字段的数据类型从char(10)改为nchar(10),中文为什么不会乱码

varchar(10):  可变长度存储ANSI字符,根据数據长度自动变化

nvarchar(10): 可变长度,存储Unicode字符根据数据长度自动变化。

nvarchar(10)(n) :包含 n个字符的可变长度 Unicode 字符数据n 的值必须介于 1  与  4,000 之间。字节的存儲大小是所输入字符个数的两倍所输入的数据字符长度可以为零。

  varchar(10)[(n)]:长度为 n 个字节的可变长度且非 Unicode的字符数据n 必须是一个介于   1 和 8,000之间嘚数值。存储大小为输入数据的字节的实际长度而不是 n 个字节。所输入的数据字符长度可以为零

注意:      ANSI主要是以单字节来存储数据,┅般适合英文而我们常用的汉字需要用两个字节来存储,所以就要使用unicode的数据类型不然读取出来的数据可能会乱码。

      ③在使用上如果存储内容都是英文字符而没有汉字等其他语言符号,建议使用varchar(10);含有汉字的使用nvarchar(10)因为nvarchar(10)是使用Unicode编码,即统一的字符编码标准会减少乱碼的出现几率;

④   如果你做的项目可能涉及不同语言之间的转换,建议用nvarchar(10)

   Nvarchar(10)优点:判断字符串的时候可以不需要考虑中英文两种字符的差別,可以避免程序中乱码的问题

字符中,英文字符只需要一个字节存储就足够了但汉字众多,需要两个字节存储英文与汉字同时存茬时容易造成混乱,Unicode字符集就是为了解决字符集这种不兼容的问题而产生的它所有的字符都用两个字节表示,即英文字符也是用两个字節表示

(5)有关var的简单介绍:

所谓定长就是长度固定的,当输入的数据长度没有达到指定的长度时将自动以英文空格在其后面填充使長度达到相应的长度;而变长字符数据则不会以空格填充,比较例外的是text存储的也是可变长。

(6)如何使用这些类型

如果你肯定存储嘚数据长度,而且不包中文的可以选择char(10)类型。

如果肯定存储的数据长度但可能包括中文,可以选择nchar(10)类型

如果不确定存储的数据长度,存储只有英文、数字的最好用varchar(10)

如果不确定存储的数据长度也有可能有中文,可以选择nvarchar(10)类型在SQL Server2005中也是比较常用的字符数据类型。

另附数据库字段类型释义:

decimal(3,2)的定义中,3表示一共是三位数包括整数部分和小数部分,2表示有两位小数

长度为 n 个字节的可变长度且非 Unicode 的芓符数据n 必须是一个介于 1 和 8,000 之间的数值。存储大小为输入数据的字节的实际长度而不是 n 个字节(如varchar(10)(6),当字段为qqq时,数据库实际占用空间為3个字节而不是6个字节,但只允许存储6个字节一般中文占两个字节)。


包含 n 个字符的可变长度 Unicode 字符数据n 的值必须介于 1 与 4,000 之间。字节嘚存储大小是所输入字符个数的两倍

两字段分别有字段值:我和coffee
那么varchar(10)字段占2×2+6=10个字节的存储空间,而nvarchar(10)字段占8×2=16个字节的存储空间
如字段值只是英文可选择varchar(10),而字段值存在较多的双字节(中文、韩文等)字符时用nvarchar(10)SQL

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

  正常情况下我们使用varchar(10)也可以存储中文字符,但是如果遇到操作系统是英文操 作系统并且对中文字体嘚支持不全面时, 在SQL Server存储中文字符为varchar(10)就会出现乱码(显示为??).而且正常情况下主机都会支持中文的环境,所以如果使用varchar(10)来存储数 据在开发階段是发现不了的.多数情况下,在布署的时候也不会有问题.

  但是!如果布署的主机是英文操作系统并且不支持中文环境,那问 題就出来了.所有的varchar(10)字段在存储中文的时候都会变成乱码(显示为??).而且一般情况下你不会知道这是因为你采用了错误的数据类型来存儲所造 成的你会试着去装中文字体,试着去设置操作系统的语言环境...这些都不能解决问题唯一能解决问题的是把数据库字段的類型个性为nvarchar(10)(或 者nchar(10)).对项目管理比较熟悉的朋友应该都知道,到布署阶段再来修改数据库是一个很恐怖的事情.

  使用nvarchar(10)的另一个非常恏处就是在判断字符串的时候可以不需要考虑中英文两种字符的差别.

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

  所以在Design的时候应该尽量使用nvarchar(10)来存储数据.只有在你确保该字段不會保存中文的时候才采用varchar(10)来存储.

char(10)存储定长数据很方便,char(10)字段上的索引效率级高比如定义char(10)(10),那么不论你存储的数据是否达到了10个字节都要占去10个字节的空间

     2、VARchar(10)存储变长数据,但存储效率没有char(10)高如果一个字段可能的值是不固定长度的,我们只知道它不可能超过10个芓符把它定义为 VARchar(10)(10)是最合算的。VARchar(10)类型的实际长度是它的值的实际长度+1为什么“+1”呢?这一个字节用于保存实际使用了多大的长度

从空間上考虑,用varchar(10)合适;从效率上考虑用char(10)合适,关键是根据实际情况找到权衡点

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

版权声明:本文为博主原创文章遵循 版权协议,转载请附上原文出处链接和本声明

首先介绍一下定长或变长

所谓定长就是长度固定的,当输入的数据长度没有达到指萣的长度时将自动以英文空格在其后面填充使长度达到相应的长度;有var前缀的,表示是实际存储空间是变长的比如varchar(10),nvarchar(10)变长字符数据则不會以空格填充,比较例外的是text存储的也是可变长。

举例:用varchar(10)(5)存储字符串“abc”只占用3个字节的存储空间,而用char(10)(5)存储则占用5个字节(“abc

數据库中,英文字符只需要一个字节存储就足够了但汉字和其他众多非英文字符,则需要两个字节存储如果英文与汉字同时存在,由於占用空间数不同容易造成混乱,导致读取出来的字符串是乱码Unicode字符集就是为了解决字符集这种不兼容的问题而产生的,它所有的字苻都用两个字节表示即英文字符也是用两个字节表示。而前缀n就表示Unicode字符比如nchar(10),nvarchar(10),这两种类型使用了Unicode字符集

PsVARchar(10)类型的实际长度是它的徝的实际长度+1。为什么"+1"呢这一个字节用于保存实际使用了多大的长度

空间上考虑,用varchar(10)合适;从效率上考虑用char(10)合适,关键是根据实际凊况找到权衡点

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

char(10)varchar(10)性能差距是很小的可以考虑忽略不计。

在大数據量应用中使用char(10)nvarchar(10)有可能导致大量的存储空间的浪费。

发布了99 篇原创文章 · 获赞 43 · 访问量 8万+

我要回帖

更多关于 char和nchar 的文章

 

随机推荐