我的服务器的默认排序规则是 Latin1_General_CI_AS,由以下查询确定:
SELECT SERVERPROPERTY('Collation') AS Collation;
Run Code Online (Sandbox Code Playgroud)
我惊讶地发现,通过这种排序规则,我可以使用 predicate 匹配字符串中的非数字字符LIKE '[0-9]'
。
为什么在默认排序规则中会发生这种情况?我想不出这会有用的情况。我知道我可以使用二进制排序规则来解决该行为,但这似乎是实现默认排序规则的奇怪方法。
我可以通过创建一个包含所有可能的单字节字符值的列并使用数字匹配谓词过滤值来演示该行为。
以下语句创建一个包含 256 行的临时表,当前代码页中的每个代码点对应一个行:
WITH P0(_) AS (SELECT 0 UNION ALL SELECT 0),
P1(_) AS (SELECT 0 FROM P0 AS L CROSS JOIN P0 AS R),
P2(_) AS (SELECT 0 FROM P1 AS L CROSS JOIN P1 AS R),
P3(_) AS (SELECT 0 FROM P2 AS L CROSS JOIN P2 AS R),
Tally(Number) AS (
SELECT -1 + ROW_NUMBER() OVER (ORDER BY (SELECT 0))
FROM P3 …
Run Code Online (Sandbox Code Playgroud)