【问题标题】:Understand Unicode and code pages in SQL Server collations了解 SQL Server 排序规则中的 Unicode 和代码页
【发布时间】:2013-03-10 21:14:54
【问题描述】:

为什么所有 SQL Server 2008 R2 排序规则都与代码页相关联。所有排序规则都是 unicode 吗?

当我们的数据库被多种语言使用不同的代码页时,如何选择排序规则?

谢谢。

【问题讨论】:

  • @marc_s Unicode (nchar/nvarchar) 字段也定义了排序规则..
  • @marc_s:同意,但您说“非 Unicode 编码 - 这些已定义排序规则”,这可能意味着 unicode 字段没有/需要排序规则,而诸如区分大小写比较/排序之类的事情无论编码如何,始终指定方法。
  • @frikozoid:好的 - 所有文本列都分配了一个排序规则。对于 non-Unicode 列 (char/varchar),它定义了编码(您可以存储和返回的可能字符)以及用于排序的字符顺序。使用非 Unicode,您必须选择 一个排序规则,然后您就被困住了。对于 Unicode 数据类型 (nchar/nvarchar),分配的排序规则 only 定义排序顺序 - 编码(可能的字符)始终是 UCS-2/UTF-16 字符set - 排序规则不会以任何方式、形状或形式影响它。

标签: sql-server sql-server-2008-r2 collation


【解决方案1】:

CHAR 与 NCHAR(即非 Unicode 与 Unicode)定义了字符存储编码。排序规则定义...排序规则(即排序顺序和比较规则)。它们是不同的概念,虽然经常混淆。

混淆源于客户端工具使用非Unicode数据的排序作为提示来选择数据的代码页。见Code Page Architecture。这意味着像 ADO.Net SqlClient 这样的客户端可以正确将从服务器接收到的单字节 CHAR 数据编码为多字节 string .Net 对象。列元数据将包含使用的排序规则,因此客户端将知道如何根据特定代码页解释单字节数据。

对于 Unicode (NCHAR) 列,客户端不需要根据代码页来解释数据,数据本身已经是多字节的,客户端将根据 UCS-2 编码(实际风味SQL Server 使用的 Unicode)。

但是,不要将此与排序规则的实际含义混淆:比较 字符的规则。如Working with Collations中所述:

说英语的人会期望字符串“Chiapas”按升序排在“Colima”之前。但是,在墨西哥讲西班牙语的人可能希望以“Ch”开头的单词出现在以“C”开头的单词列表的末尾。排序规则规定了这些排序和比较规则。在 ORDER BY ASC 子句中,Latin_1 通用排序规则会将“恰帕斯”排序在“科利马”之前,而传统_西班牙排序规则会将“恰帕斯”排序在“科利马”之后。

此排序规则适用于任何数据类型(CHAR 非 Unicode 或 NCHAR Unicode)。

【讨论】:

  • @marc_s:当您看到“恰帕斯”并认为 'Turkish I'...
猜你喜欢
  • 2012-02-22
  • 2011-09-28
  • 1970-01-01
  • 2015-09-21
  • 2011-05-05
  • 2014-02-22
  • 2012-07-03
  • 2021-04-13
  • 2018-07-01
相关资源
最近更新 更多