用于使用表情符号正确排序 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
是没有意义的。 a
和 b
等 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,按升序排序生成此图像:
我想知道我应该使用哪种排序规则来对包含文本和表情符号的 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
是没有意义的。 a
和 b
等 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,按升序排序生成此图像: