积极答复者
SQL Server 编码问题

问题
答案
-
如果你的服务端和客户端使用不同的代码页,那么加 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 列中。如果这些选项中有任何一个不可行,则替代方法是使用 binary、varbinary 或 varbinary(max) 数据类型,将数据存储在二进制列中。但是,二进制数据只能以二进制顺序来进行排序和比较。这使得它的灵活性不如字符数据。
- 已建议为答案 Steven.桦仔 2014年9月10日 12:55
- 已标记为答案 Michelle GeModerator 2014年9月16日 2:14
-
http://technet.microsoft.com/zh-cn/library/ms190252(v=sql.105).aspx
当把客户端发送的非 Unicode 数据以 Unicode 存储在服务器中时,如果具备下列条件之一,则来自任何客户端的任何代码页的数据都可以正确地存储。
-
字符串作为远程过程调用 (RPC) 的参数发送到服务器。
-
字符串常量以大写字母 N 开头。无论客户端应用程序是否能够识别 Unicode,必需这样做。如果没有字母 N 前缀,则 SQL Server 会将字符串转换为与数据库的默认排序规则相对应的代码页。此代码页中没有的字符都将丢失。
- 已标记为答案 Michelle GeModerator 2014年9月16日 2:14
-
全部回复
-
如果你的服务端和客户端使用不同的代码页,那么加 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 列中。如果这些选项中有任何一个不可行,则替代方法是使用 binary、varbinary 或 varbinary(max) 数据类型,将数据存储在二进制列中。但是,二进制数据只能以二进制顺序来进行排序和比较。这使得它的灵活性不如字符数据。
- 已建议为答案 Steven.桦仔 2014年9月10日 12:55
- 已标记为答案 Michelle GeModerator 2014年9月16日 2:14
-
http://technet.microsoft.com/zh-cn/library/ms190252(v=sql.105).aspx
当把客户端发送的非 Unicode 数据以 Unicode 存储在服务器中时,如果具备下列条件之一,则来自任何客户端的任何代码页的数据都可以正确地存储。
-
字符串作为远程过程调用 (RPC) 的参数发送到服务器。
-
字符串常量以大写字母 N 开头。无论客户端应用程序是否能够识别 Unicode,必需这样做。如果没有字母 N 前缀,则 SQL Server 会将字符串转换为与数据库的默认排序规则相对应的代码页。此代码页中没有的字符都将丢失。
- 已标记为答案 Michelle GeModerator 2014年9月16日 2:14
-