了解SQL Server排序规则中的Unicode和代码页

时间:2013-03-21 11:25:51

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

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

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

谢谢。

1 个答案:

答案 0 :(得分:9)

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”开头的单词列表的末尾。排序规定了这些排序和比较规则。 Latin_1 General collat​​ion将在'Colima'之前在ORDER BY ASC子句中对'Chiapas'进行排序,而Traditional_Spanish排序将在'Colima'之后对'Chiapas'进行排序。

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