为什么所有SQL Server 2008 R2排序规则都与代码页相关联。所有归类都是unicode吗?
当使用不同代码页的多种语言使用我们的数据库时,如何选择排序规则?
谢谢。
答案 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 collation将在'Colima'之前在ORDER BY ASC子句中对'Chiapas'进行排序,而Traditional_Spanish排序将在'Colima'之后对'Chiapas'进行排序。
此排序规则适用于任何数据类型(CHAR非Unicode或NCHAR Unicode)。