SQL Server中字符串型和Unicode字符串型的区别(网摘+书摘的整理)

SQL  Server中字符串型和Unicode字符串型的区别

 标签: 

sqlserver 

数据库

分类: SqlServer
看书时感觉字符串型(varchar等)和Unicode字符串型(nchar等)很让人费解;花了一点时间,以下是网摘和书摘的整理:
 
例如 varchar 和 nvarchar :
nvarchar   和   varchar   的区别是存储方式不同 
varchar是按字节存储。而带nvarchar是按字符存储
比如说varchar(40),能存储40个字节长度的字符,存储中文字符的时候,因为中文字符1个字符就等于2个字节.所以varchar(40)只能存储20个中文字符。
nvarchar每个字符占用2个字节,nvarchar(40),就可以存储40个中文字符。nvarchar要相对于存储的字符类型。比如有些字符是占3个字节的。 
同样的,char和nchar也一样道理。
 
 
关于长度超过4000的Unicode字符串或超过8000的ASCII字符串:
不推荐使用ntext或text,应使用nvarchar(max)和varchar(max)替代text;
         text和ntext未来将被微软废弃。
 
关于使用:
每个数据库在建立的时候都要指定一个 Collation, 建立好的数据库你可以在属性页里看到。Collation 的选择决定了你的数据库数据的存储格式,还有大小写敏感等,其中些是 Chinese 有关的 Collation, 当选择了这些 Collation 后,你的数据库中所有的表都可以自动支持 Unicode 而不需要再选择nVarchar了。但是假如你选择了 Latin 有关的 Collation, 这时候 Varchar 字段就不能存储中文了,所以你只能选择nVarchar 字段类型。
也就是说通常我们应该使用Chinese有关的Collation,并在需要中文字符串时尽量使用nvarchar;
有时既有varchar又有nvarchar时会有性能问题;例如 非Unicode字符串的列,使用Unicode字符串的查询条件查询时,查询结果会执行表扫描而不是使用索引。  
  • 也就是说使用varchar存储Unicode字符(比如中文),在查询时(必定也会是Unicode条件),会执行表扫描,而不执行索引, 会明显影响性能;
使用varchar字符串类型作为nvarchar列的查询条件则应该不会有问题,系统会自动将varchar转换为Unicode字符。
 
中文默认使用 Chinese_PRC_CI_AS
 
原文地址:https://www.cnblogs.com/scottgu/p/2264978.html