字符串比较的意外结果

Sal*_*n A 9 sql t-sql sql-server string

我无法理解以下行为:

WITH tests(min, val, max) AS (
    SELECT 'a', 'x', 'z' UNION ALL
    SELECT '',  'x', 'z' UNION ALL
    SELECT 'a', 'x', '~'
)
SELECT min, val, max, CASE WHEN val BETWEEN min AND max THEN 'PASS' ELSE 'FAIL' END AS result
FROM tests
Run Code Online (Sandbox Code Playgroud)

结果:

| min | val | max | result |
|-----|-----|-----|--------|
| a   | x   | z   | PASS   |
|     | x   | z   | PASS   |
| a   | x   | ~   | FAIL   |
Run Code Online (Sandbox Code Playgroud)

为字符码x~分别是120和126.在我所知道的每种编程语言中'x' < '~' is true.那么SQL是什么?

我在不同的RDBMS上得到相同的结果.在SQL Server上,使用以下排序规则:

Latin1-General,不区分大小写,区分重音,不区分kanatype,宽度不敏感

ror*_*.ap 4

在您的问题下面的评论中,我问您使用的是什么排序规则。你说“假设默认”,但没有“默认”。“默认”取决于您的数据库和服务器的设置方式。我在我的 SQL Server 上运行了你的实验,碰巧得到了与你相同的结果,但这只是巧合。

我运行实验的 SQL Server 和数据库正在使用SQL_Latin1_General_CP1_CI_AS排序规则。基于这一事实,以下是字符的顺序:

http://collat​​ion-charts.org/mssql/mssql.0409.1252.Latin1_General_CI_AS.html

请注意,波形符~出现在字母字符之前x,其中显然包括。