我无法理解以下行为:
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
结果:
| min | val | max | result |
|-----|-----|-----|--------|
| a | x | z | PASS |
| | x | z | PASS |
| a | x | ~ | FAIL |
x
的字符代码和~
分别是120和126。在我所知道的每种编程语言中'x' < '~' is true
。那么 SQL 是什么呢?
我在不同的 RDBMS 上得到相同的结果。在 SQL Server 上,使用以下排序规则:
Latin1-General, case-insensitive, accent-sensitive, kanatype-insensitive, width-insensitive
最佳答案
在你的问题下面的评论中,我问你什么 collation你正在使用。你说“假设默认”,但没有“默认”。 “默认”取决于您的数据库和服务器的设置方式。我在我的 SQL Server 上运行了你的实验,碰巧得到了与你相同的结果,但这只是巧合。
我运行实验的 SQL Server 和数据库使用 SQL_Latin1_General_CP1_CI_AS
排序规则。基于这一事实,以下是字符的排序:
http://collation-charts.org/mssql/mssql.0409.1252.Latin1_General_CI_AS.html
请注意,波浪号 ~
出现在字母字符之前,其中显然包括 x
。
关于sql - 字符串比较的意外结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51558368/