sql server的like默认不区分大小写,除非列或数据库使用cs排序规则(如chinese_prc_cs_as);可通过查询sys.columns获取collation_name判断,含cs则区分,含ci则不区分;临时强制不区分可用collate ci_as、upper()函数或计算列。

SQL Server的LIKE默认就是不区分大小写的
除非数据库或列显式设置了区分大小写的排序规则(如 Latin1_General_CS_AS),否则 LIKE 查询天然不区分大小写。多数生产环境用的是 Latin1_General_CI_AS(CI = Case Insensitive)或类似带 CI 的排序规则,所以直接写 WHERE name LIKE '%abc%' 就能匹配 ABC、Abc、abc。
如何确认当前列是否区分大小写
查列的排序规则最可靠:
SELECT collation_name
FROM sys.columns
WHERE object_id = OBJECT_ID('your_table')
AND name = 'your_column';
如果返回值含 CS(如 SQL_Latin1_General_CP1_CS_AS),那 LIKE 就会区分大小写;含 CI 则不会。也可以临时测试:
SELECT 1 WHERE 'ABC' LIKE 'abc' —— 返回结果说明当前上下文不区分大小写;无结果则区分。
想强制不区分大小写但列是CS排序规则怎么办
有三个稳妥办法,按推荐顺序排列:
- 在查询中显式指定排序规则:
WHERE column_name COLLATE Latin1_General_CI_AS LIKE '%abc%' - 用函数统一转大小写(简单但可能影响索引使用):
WHERE UPPER(column_name) LIKE UPPER('%abc%') - 建计算列并加索引(适合高频查询):
ALTER TABLE t ADD name_ci AS (UPPER(name)) PERSISTED,然后查name_ci
注意:COLLATE 方式最轻量,且能走原列索引(只要排序规则兼容);而 UPPER() 会导致索引失效,除非你对函数结果建了函数索引(SQL Server 2016+ 支持表达式索引,但需手动创建)。
通配符和ESCAPE要注意编码兼容性
当用 ESCAPE 指定转义字符时,比如 LIKE '%50\% off' ESCAPE '\',这个反斜杠本身也要符合当前排序规则的字符集解释。如果列是 UTF8 排序规则(SQL Server 2019+),而客户端用的是旧 ODBC 驱动,可能把 \ 当成字节而非 Unicode 字符处理,导致转义失败。稳妥做法是选一个 ASCII 范围内、且业务数据里绝不会出现的字符作 escape,比如 !:LIKE '%50!% off' ESCAPE '!'。
真正容易被忽略的是:排序规则不仅影响大小写,还影响重音、假名、甚至空格比较逻辑。改 COLLATE 时别只盯着 CI/CS,顺手看一眼后缀里的 AI/AS(重音敏感)和 KS(假名敏感)——这些也会静默改变 LIKE 行为。











