sql - 字符串比较的意外结果

标签 sql sql-server string tsql

我无法理解以下行为:

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/

相关文章:

mysql - 如何进行多条件连接

sql - 更新查询在 SQL Server 中运行,但不在 Oracle 中运行

sql-server - 禁止重复列的 XML DML (Xpath) 查询。它应该在插入列之前测试它是否存在

java - 用于在字符串中搜索子字符串的快速算法

java - 尝试使用字符数组解密字符串(Polybius Square)

mysql - 用一个等效查询替换两个查询

mysql - SQL 连接多个表并按单列排序

sql-server - 当过滤器是逗号分隔的值列表时如何过滤记录

sql - 查找出现次数

arrays - firebase 子值作为数组中的字符串来填充选择器 swift 3