none
SQL Server 编码问题 RRS feed

  • 问题

  • 原来我的SQL Server的查询语句,可以这样写:

    SELECT *
      FROM [MABAOLI_B].[dbo].[ADDRESS]
      where NAME='长沙明鑫'

    而现在,如果我筛选的内容是中文的话,必须要加N,才能查询出来,否则无法查询出结果。

    SELECT *
      FROM [AX50_BFP_SP1_PROD].[dbo].[ADDRESS]
      WHERE NAME=N'长沙明鑫'

    2014年9月10日 5:02

答案

  • 如果你的服务端和客户端使用不同的代码页,那么加 N 是必须的

    http://technet.microsoft.com/zh-cn/library/ms175074(v=sql.105).aspx

    当数据库不使用 Unicode 数据类型来存储字符数据时,以及当客户端交互数据的应用程序也不能识别 Unicode 时,如何保持字符数据的完整性。在这种情况下,数据存储的代码页和客户端应用程序的代码页必须相同。如果代码页不相同,则客户端和服务器之间的转化有可能导致某些字符丢失。

    不支持通过禁用 SQL Server ODBC 驱动程序的 AutoTranslate 功能来插入由服务器上其他代码页定义的数据。而且,即使禁用了 AutoTranslate,也不能防止 SQL 语言事件进行代码页转换。其结果是,如果客户端和数据库的代码页不匹配,将对所有发往(或发自)服务器的非 Unicode 字符串进行代码页转换。

    如果可以,应尽量避免这种情况发生。具有特殊代码页的服务器最好是仅和使用相同代码页的客户端通信。其次是使用另一种字符集大致相同的代码页。例如,代码页 1252 (Latin1) 和代码页 850 (Multilingual Latin1) 存储的字符集几乎完全相同,因此这两种代码页中的大部分字符可以相互转换而不会丢失数据。

    如果您必须使用不同的代码页和客户端通信,则可采用的解决方案是将您的数据存储到 Unicode 列中。如果这些选项中有任何一个不可行,则替代方法是使用 binaryvarbinaryvarbinary(max) 数据类型,将数据存储在二进制列中。但是,二进制数据只能以二进制顺序来进行排序和比较。这使得它的灵活性不如字符数据。

    2014年9月10日 5:53
  • http://technet.microsoft.com/zh-cn/library/ms190252(v=sql.105).aspx

    当把客户端发送的非 Unicode 数据以 Unicode 存储在服务器中时,如果具备下列条件之一,则来自任何客户端的任何代码页的数据都可以正确地存储。

    • 字符串作为远程过程调用 (RPC) 的参数发送到服务器。

    • 字符串常量以大写字母 N 开头。无论客户端应用程序是否能够识别 Unicode,必需这样做。如果没有字母 N 前缀,则 SQL Server 会将字符串转换为与数据库的默认排序规则相对应的代码页。此代码页中没有的字符都将丢失。

    2014年9月10日 5:55

全部回复

  • 我怎样操作,才能恢复成原来的设置?就是不加N也可以直接查询。

    因为我原来做了很多的小程序,如果需要加N,那么我以前的程序就要全部重新调试

    2014年9月10日 5:04
  • 如果你的服务端和客户端使用不同的代码页,那么加 N 是必须的

    http://technet.microsoft.com/zh-cn/library/ms175074(v=sql.105).aspx

    当数据库不使用 Unicode 数据类型来存储字符数据时,以及当客户端交互数据的应用程序也不能识别 Unicode 时,如何保持字符数据的完整性。在这种情况下,数据存储的代码页和客户端应用程序的代码页必须相同。如果代码页不相同,则客户端和服务器之间的转化有可能导致某些字符丢失。

    不支持通过禁用 SQL Server ODBC 驱动程序的 AutoTranslate 功能来插入由服务器上其他代码页定义的数据。而且,即使禁用了 AutoTranslate,也不能防止 SQL 语言事件进行代码页转换。其结果是,如果客户端和数据库的代码页不匹配,将对所有发往(或发自)服务器的非 Unicode 字符串进行代码页转换。

    如果可以,应尽量避免这种情况发生。具有特殊代码页的服务器最好是仅和使用相同代码页的客户端通信。其次是使用另一种字符集大致相同的代码页。例如,代码页 1252 (Latin1) 和代码页 850 (Multilingual Latin1) 存储的字符集几乎完全相同,因此这两种代码页中的大部分字符可以相互转换而不会丢失数据。

    如果您必须使用不同的代码页和客户端通信,则可采用的解决方案是将您的数据存储到 Unicode 列中。如果这些选项中有任何一个不可行,则替代方法是使用 binaryvarbinaryvarbinary(max) 数据类型,将数据存储在二进制列中。但是,二进制数据只能以二进制顺序来进行排序和比较。这使得它的灵活性不如字符数据。

    2014年9月10日 5:53
  • http://technet.microsoft.com/zh-cn/library/ms190252(v=sql.105).aspx

    当把客户端发送的非 Unicode 数据以 Unicode 存储在服务器中时,如果具备下列条件之一,则来自任何客户端的任何代码页的数据都可以正确地存储。

    • 字符串作为远程过程调用 (RPC) 的参数发送到服务器。

    • 字符串常量以大写字母 N 开头。无论客户端应用程序是否能够识别 Unicode,必需这样做。如果没有字母 N 前缀,则 SQL Server 会将字符串转换为与数据库的默认排序规则相对应的代码页。此代码页中没有的字符都将丢失。

    2014年9月10日 5:55