varchar和nvarchar的区别

     SQL Server提供两种数据类型来存储字符信息。在如何在SQL Server或应用程序中使用方面,这两种数据类型大致是一样的。差别在于nvarchar是用于存储处理数据库图表中多语言数据的Unicode数据。其它语言有一套需要保存的字符代码的扩展集,这种数据类型支持这样的扩展。因为需要存储其它语言的扩展字符代码,nvarchar占用的空间是varchar的两倍。

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

需要注意的是在执行sp_ExecuteSQL 存储过程时,要执行的sql语句字符串一定要是Unicode类型的,
如:EXEC sp_ExecuteSQL N'select 1' 正确
      EXEC sp_ExecuteSQL 'select 1' 错误



另外:

当只使用字符数据和代码页时,在一个数据库内很难以多种语言存储数据。也很难为数据库找到一种能存储所有需要的语言特定字符的代码页。此外,当运行不同代码页的不同客户端读取和更新特殊字符时,很难保证正确转换这些字符。支持国际化客户端的数据库应始终使用 Unicode 数据,而不应使用非 Unicode 数据类型。

例如,有一个必须处理三种主要语言的北美洲客户的数据库:

墨西哥使用的西班牙语名称和地址


魁北克使用的法语名称和地址


加拿大其余地区和美国使用的英语名称和地址


当只使用字符列和代码页时,必须小心以确保与数据库一起安装的代码页能处理所有这三种语言的字符。另外,还必须小心保证当运行某种语言的代码页的客户端读取另一种语言的字符时,能够正确转换字符。

随着 Internet 的发展,支持运行着不同区域设置的众多客户端计算机变得更加重要。但很难为支持世界范围的读者所需的所有字符的字符数据类型选择代码页。

管理国际化数据库中的字符数据的最简单方法是始终使用 Unicode nchar、nvarchar 和 ntext 数据类型,而不是使用相应的非 Unicode 数据类型(char、varchar 和 text)。

Unicode 是一种将码位映射到字符的标准。由于它的设计中涵盖世界上所有语言的全部字符,因此不需要不同的代码页来处理不同的字符集。SQL Server 2005 支持 Unicode 标准 3.2 版。

如果所有使用国际化数据库的应用程序也采用 Unicode 变量而不是非 Unicode 变量,那么在系统中的任何地方都无需进行字符转换。客户端与所有其他客户端看到的数据中的字符相同。

SQL Server 2005 将所有文字系统目录数据存储在包含 Unicode 数据类型的列中。数据库对象(如表、视图和存储过程)的名称存储在 Unicode 列中。这样就可以只使用 Unicode 来开发应用程序,从而有利于避免所有代码页转换问题。



如繁体系统输入简体字时


insert T select N'简体字'--不加N时会变为?号

原文地址:https://www.cnblogs.com/zhuawang/p/1242023.html