nvarchar 和 varchar 的区别是存储方式不同
varchar是按字节存储的。而带nvarchar是按字符存储的
比如说varchar(40),能存储40个字节长度的字符,存储中文字符的时候,因为中文字符1个字符就等于2个字节.所以varchar(40)只能存储20个中文字符。
nvarchar每个字符占用2个字节,
nvarchar(40),就可以存储40个中文字符。nvarchar要相对于存储的字符类型。比如有些字符是占3个字节的。
同样的,char和nchar也一样道理。
varhchar 和 char
关于使用:
每个数据库在建立的时候都要指定一个 Collation, 建立好的数据库你可以在属性页里看到。Collation 的选择决定了你的数据库数据的存储格式,还有大小写敏感等,其中些是 Chinese 有关的 Collation, 当选择了这些 Collation 后,你的数据库中所有的表都可以自动支持 Unicode 而不需要再选择nVarchar了。但是假如你选择了 Latin 有关的 Collation, 这时候 Varchar 字段就不能存储中文了,所以你只能选择nVarchar 字段类型。
也就是说通常我们应该使用Chinese有关的Collation,并在需要中文字符串时尽量使用nvarchar;
有时既有varchar又有nvarchar时会有性能问题; 例如 非Unicode字符串的列,使用Unicode字符串的查询条件查询时,查询结果会执行表扫描而不是使用索引。
- 也就是说使用varchar存储Unicode字符(比如中文),在查询时(必定也会是Unicode条件),会执行表扫描,而不执行索引会明显影响性能;如果不指定collation,那么在英文操作系统上指定的varchar类型的就显示不出来了。这里还有一个问题就是,虽然在不指定collation时,nvarchar可以兼容中英文,但是占用空间大了一倍。
- 所以,最佳方案是
- 有中文时:指定collation如 collation Chinese_PRC_CI_AS,用nvarchar这样既省了空间,有不会出错
- 英文时:制定collation为latin的用varchar
中文默认使用 Chinese_PRC_CI_AS
附:unicode和ascii区别: ASCII就是编码英文的26个字母和一些常见的符号,之后扩展了一半。总之是一个字节来做编码,大于128的部分是一些特殊符号。但ASCII是无法编码别的东西的,比如说是不存在“中文的ascii码需要2个字符”这种说法的。ASCII就只有一个字节。Unicode是足够编码地球上所有的语言了,所以ASCII中所能表示的,Unicode当然全部包括了。Unicode本身是只有2个字节的,之所以出现UTF-8,UTF-16等等之类,那是为了针对不同的应用环境,提高整体编码效率,比如如果某篇文章里绝大部分是英语(单字节就能表示),就比较适合使用utf-8,而如果绝大部分是中文(需要双字节),可能就utf-16比较合适了