用于使用表情符号正确排序 nvarchar 字段的 MSSQL 排序规则

MSSQL collation for correct sorting of nvarchar field with emojis

我想知道我应该使用哪种排序规则来对包含文本和表情符号的 nvarchar 列进行一致排序。 在任何情况下,预期结果都是这样的(按 MS Excel 排序):

第一次尝试:SQL_Latin1_General_CP1_CI_AI

SELECT Val
FROM (VALUES
    (N'⭐⭐⭐'),
    (N'⭐⭐⭐'),
    (N''),
    (N'⭐⭐'),
    (N'⭐⭐'),
    (N''),
    (N'⭐'),
    (N'❗❗'),
    (N'❗❗'),
    (N'❗'),
    (N'❗'),
    (N'❗❗❗'),
    (N'❗❗❗'),
    (N'bb'),
    (N'ab'),
    (N'aa')
) AS A (Val)
ORDER BY Val COLLATE SQL_Latin1_General_CP1_CI_AI

结果(与预期不符):

第二次尝试(基于这个答案):Latin1_General_100_CI_AS_SC

SELECT Val
FROM (VALUES
    (N'⭐⭐⭐'),
    (N'⭐⭐⭐'),
    (N''),
    (N'⭐⭐'),
    (N'⭐⭐'),
    (N''),
    (N'⭐'),
    (N'❗❗'),
    (N'❗❗'),
    (N'❗'),
    (N'❗'),
    (N'❗❗❗'),
    (N'❗❗❗'),
    (N'bb'),
    (N'ab'),
    (N'aa')
) AS A (Val)
ORDER BY Val COLLATE Latin1_General_100_CI_AS_SC;

结果(与预期不符):

有人处理过吗?

尝试二进制排序规则。 EG

SELECT Val
FROM (VALUES
    (N'⭐⭐⭐'),
    (N'⭐⭐⭐'),
    (N''),
    (N'⭐⭐'),
    (N'⭐⭐'),
    (N''),
    (N'⭐'),
    (N'❗❗'),
    (N'❗❗'),
    (N'❗'),
    (N'❗'),
    (N'❗❗❗'),
    (N'❗❗❗'),
    (N'bb'),
    (N'ab'),
    (N'aa')
) AS A (Val)
ORDER BY Val COLLATE Latin1_General_100_BIN2

产出

Val
----
aa
ab
bb
❗
❗
❗❗
❗❗
❗❗❗
❗❗❗
⭐
⭐⭐
⭐⭐
⭐⭐⭐
⭐⭐⭐



(16 rows affected)

在任何以表情符号开头的字符串之后排列 aa-bb 是没有意义的。 ab 等 ASCII 字母在所有排序规则中排在第一位。

表情符号不属于任何语言,因此正常排序规则不会以任何特定方式对它们进行排序。您需要使用二进制排序规则 (_BIN2) 来根据字符的代码点值对字符进行排序。例如:

SELECT Val
FROM (VALUES
    (N'⭐⭐⭐'),
    (N'⭐⭐⭐'),
    (N''),
    (N'⭐⭐'),
    (N'⭐⭐'),
    (N''),
    (N'⭐'),
    (N'❗❗'),
    (N'❗❗'),
    (N'❗'),
    (N'❗'),
    (N'❗❗❗'),
    (N'❗❗❗'),
    (N'bb'),
    (N'αα'),
    (N'ab'),
    (N'aa')
) AS A (Val)
ORDER BY Val COLLATE Greek_BIN2;

ORDER BY Val COLLATE Latin1_General_100_BIN2;

生产

aa
ab
bb
αα
❗
❗
❗❗
❗❗
❗❗❗
❗❗❗
⭐
⭐⭐
⭐⭐
⭐⭐⭐
⭐⭐⭐


为什么 Excel 在做什么?

看起来 Excel 将这些字形视为数字,但将它们排序 实际数字之后。带数字的文本也排在表情符号之后。

我怀疑表情符号被视为数字,因为 Excel 使用此类字形作为仪表板中的指示符。

尽管顺序不是很一致,在 Unicode table 中出现较晚的表情符号在星号和旗帜之前排序。在 Excel 中,对于 Mac,按升序排序生成此图像: