乔什表示:
”... ... 在使用 Unicode 时需要记住的一点是,尽管可以将不同的语言存储在单个列中,但只能使用单个排序规则进行排序。有些语言使用拉丁字符,但与其他拉丁语言不同。口音就是一个很好的例子,我不记得这个例子了,但是有一种东欧语言的 Y 和英语的 Y 不一样。还有西班牙语,西班牙用户希望在 h 之后进行排序。”
declare @i int = 0;
while (@i < 256)
begin
print cast(@i as varchar(3)) + ' '+ char(@i) collate SQL_Latin1_General_CP1_CI_AS
print cast(@i as varchar(3)) + ' '+ char(@i) collate Japanese_90_CI_AS
set @i = @i+1;
end
Let's say we wanna store a peculiar text on our MSSQL Server database. It could be an Instagram comment as "I love stackoverflow! 😍".
即使是 ASCII 也完全支持简单的英语部分,但是由于还有一个表情符号,这是一个在 UNICODE标准中指定的字符,我们需要一个支持这个 Unicode字符的 ENCODING。< br/>
MSSQL Server 使用 COLLATION来确定在 char/nchar/varchar/nvarchar字段中使用哪些 ENCODING。因此,不同于很多人的想法,COLLATION不是只是关于排序和比较数据,但也关于 ENCODING,并由结果: 我们的数据将如何存储!
那么 我们如何知道排序所使用的编码?是这样的:
SELECT COLLATIONPROPERTY( 'Latin1_General_CI_AI' , 'CodePage' ) AS [CodePage]
--returns 1252
这个简单的 SQL 返回 COLLATION的 Windows Code Page。Windows Code Page不过是到 ENCODINGs的另一个映射。对于 Latin1_General_CI_AICOLLATION,它返回 Windows Code Page代码 1252,该代码映射到 Windows-1252ENCODING。
因此,对于使用 Latin1_General_CI_AICOLLATION的 varchar列,此字段将使用 Windows-1252ENCODING处理其数据,并且只能正确地存储此编码支持的字符。