导读:本期聚焦于小伙伴创作的《SQL中如何实现不区分大小写的查询?使用UPPER函数还是指定排序规则更好》,敬请观看详情。在跨平台系统里,用户登录名或邮箱常混用大小写,直接写WHERE name = 'Tom'会漏掉'Tom'和'TOM'。一种做法是套一层UPPER把字段和值都转大写再比,逻辑直观但索引易失效。另一种是在建表或查询时指定不区分大小写的排序规则,如SQL Server的CI或MySQL的utf8_general_ci,由引擎在比较层忽略大小写。两者在写法、性能与数据库兼容性上差别明显:函数包裹适合临时改造,排序规则更利于长线优化。下文从原理、示例与取舍三方面说明具体用法。

在数据库查询中,英文字符的大小写差异经常导致匹配失败。比如用户表中既存有admin也存有Admin,业务希望按账号查找时把它们视为同一值,这就需要做不区分大小写的查询。本文围绕UPPER函数和排序规则两种主流方案,讲清它们的实现方式与适用边界。

SQL中如何实现不区分大小写的查询?使用UPPER函数还是指定排序规则更好

一、使用UPPER函数进行转换比较

UPPER是SQL标准里的字符串函数,作用是把字母转成大写。查询时同时对字段和传入值调用UPPER,就能让两边处于同一大小写形态,从而忽略原始大小写差别。这种方式不依赖数据库配置,任何支持UPPER的库都能直接用。

下面以查询用户名为例,展示基础写法。注意值也要用UPPER包住,否则只是字段转了大写、值还是小写,依然匹配不上。

SELECT id, username
FROM users
WHERE UPPER(username) = UPPER('Admin');

这种写法的优点是改动小、语义清楚,临时排查或老系统补丁常用。但缺点同样明显:对字段使用函数会让该列上的普通B树索引失效,数据库只能全表扫描。数据量达到几十万行以上时,查询延迟会明显上升。

如果确实要用函数又想保性能,可以考虑建函数索引。例如在Oracle或PostgreSQL中创建基于UPPER的表达式索引,查询计划就能命中它。不过这会增加写入成本和存储占用,属于用空间换时间。

-- PostgreSQL 创建函数索引示例
CREATE INDEX idx_users_username_upper
ON users (UPPER(username));

二、通过指定排序规则忽略大小写

排序规则(Collation)决定了字符在比较和排序时的规则。很多库默认用区分大小写的规则,比如SQL Server的CS、MySQL的bin。只要换成不区分大小写的规则,例如SQL Server的CI(Case Insensitive)或MySQL的ci,等值比较天然忽略大小写。

可以在建表时给字段指定,也能在查询时临时覆盖。下面分别是MySQL和SQL Server的示例,两者语法不同但目的一致:让name字段的比较不关心大小写。

-- MySQL 建表时指定排序规则
CREATE TABLE accounts (
  id INT PRIMARY KEY,
  name VARCHAR(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci
);

-- SQL Server 查询时指定排序规则
SELECT id, name
FROM accounts
WHERE name = 'Admin' COLLATE SQL_Latin1_General_CP1_CI_AI;

用排序规则的好处是查询语句干净,不需要包裹函数,原有索引通常还能正常使用,性能远好于UPPER扫描。它也更贴近数据本身的语义:账号本就不该区分大小写,放在结构层定义比写在每行SQL里更合理。

需要注意跨库迁移时的兼容问题。不同数据库排序规则命名差异很大,MySQL的ci规则在PostgreSQL里要用ILIKE或citext扩展实现类似效果。因此如果系统未来可能换库,要把规则写法抽象到迁移脚本中统一管理。

三、两种方案怎么选

从工程角度看,新项目优先在设计阶段定好字段排序规则,避免后续每个查询都加函数。老项目若不敢动表结构,用UPPER做过渡,再配合函数索引缓解慢查询,是风险较低的路线。

下面用一张表归纳核心差异,方便对照决策。

维度UPPER函数指定排序规则
语法侵入性每条SQL都要写建表或单次声明
索引利用默认失效,需函数索引普通索引可用
数据库依赖基本通用规则名各库不同
适用场景临时修复、小表长期设计、大表

实际落地时也可以组合使用:核心账号字段用ci规则,日志类附属查询用UPPER兜底。只要团队规范清楚,就不会出现同一逻辑两种写法混用带来的维护混乱。

四、常见误区提醒

有人以为LIKE配合UPPER就一定能忽略大小写,其实在区分大小写的库里,若只给字段UPPER而值不转,仍然会漏匹配。还有人把排序规则当成只在ORDER BY生效,实际上WHERE等值比较同样受它控制。

另一个坑是误信客户端工具显示结果。某些GUI会把结果统一显示成某种大小写,让人错觉查询已忽略大小写,直连命令行执行才暴露问题。验证时建议用含混合大小写的测试数据跑一遍再上线。

-- 验证用测试数据
INSERT INTO users (id, username) VALUES (1, 'Admin'), (2, 'admin'), (3, 'ADMIN');
-- 观察三种写法分别返回几行
SELECT COUNT(*) FROM users WHERE username = 'admin';
SELECT COUNT(*) FROM users WHERE UPPER(username) = UPPER('admin');
SELECT COUNT(*) FROM users WHERE username = 'admin' COLLATE utf8mb4_general_ci;

把上面三段在目标环境跑一遍,就能确认当前库的行为,再决定采用哪种方案。理清原理后,不区分大小写查询不过是配置或写法上的小选择,不必过度设计。

SQLUPPER函数排序规则修改时间:2026-08-09 22:51:38

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。