upper函数用于将字符串中ascii字母转为大写,不改变数字、符号、中文等,适用于select格式化、where大小写无关匹配及update批量转换;需注意null返回null、索引失效风险及跨库行为差异。

UPPER函数的基本用法和适用场景
UPPER() 是标准 SQL 中用于将字符串转为大写的标量函数,几乎所有主流数据库(PostgreSQL、MySQL、SQL Server、Oracle、SQLite)都支持。它只影响 ASCII 字母 a–z,对数字、符号、空格、中文或 Unicode 字符无影响,也不会报错——这点常被误认为“没生效”。
典型使用场景包括:清洗用户输入的姓名/邮箱、做大小写不敏感比对(配合 WHERE)、生成标准化标签字段。
在SELECT中转换显示结果但不修改原数据
这是最安全的用法,仅改变查询输出,不影响表中存储值:
SELECT name, UPPER(name) AS name_upper FROM users;
注意:UPPER() 不能直接用于列别名定义之外的表达式上下文,比如不能写成 SELECT UPPER(name) FROM users ORDER BY name 然后指望排序按大写进行——除非显式写 ORDER BY UPPER(name)。
- MySQL 8.0+ 和 PostgreSQL 支持在
ORDER BY或GROUP BY中直接用UPPER(col) - SQL Server 要求
UPPER(col)出现在SELECT列表中才能在ORDER BY引用(除非用数字序号) - 如果字段含 NULL,
UPPER(NULL)仍返回 NULL,无需额外判空
UPDATE语句中批量更新字段值为大写
想真正把数据库里存的小写英文改成大写,必须用 UPDATE:
UPDATE users SET email = UPPER(email) WHERE email IS NOT NULL;
关键点:
- 务必加
WHERE条件限制范围,否则全表更新可能锁表、耗时长、影响业务 - 若字段有唯一约束(如
UNIQUE(email)),先确认大小写转换后不会产生重复值,否则语句会失败并报错duplicate key value violates unique constraint - 某些数据库(如 MySQL 的 utf8mb4_bin 排序规则)下,
UPPER()对非 ASCII 字符(如带重音的 é)行为不一致,建议先在测试环境验证
与LIKE配合实现大小写无关模糊匹配
当需要忽略大小写查 “john” 时,不要依赖数据库默认的 collation 行为(不可靠且难移植),而应统一转换:
SELECT * FROM users WHERE UPPER(name) LIKE UPPER('%john%');
但要注意性能问题:
-
UPPER(name)会使该列无法走普通 B-tree 索引(除非建函数索引) - PostgreSQL 可建
CREATE INDEX idx_users_name_upper ON users (UPPER(name)); - MySQL 8.0+ 支持函数索引,但需显式指定:
CREATE INDEX idx_name_upper ON users ((UPPER(name))); - SQL Server 需用计算列 + 索引,或改用
COLLATE SQL_Latin1_General_CP1_CI_AS这类大小写不敏感排序规则
实际项目中,如果频繁做大小写无关搜索,优先考虑在应用层归一化输入,或建专用的大写冗余字段并维护一致性,比每次函数计算更可控。











