upper(str)仅接受一个字符串参数,将ascii字母转为大写,非ascii字符、数字、符号不变;传入null返回null;在where中使用会导致索引失效,应优先通过校对规则(如utf8mb4_general_ci)实现大小写不敏感匹配。

UPPER函数怎么用,参数有什么讲究
UPPER(str) 只接受一个参数,必须是字符串类型(VARCHAR、TEXT、甚至数字会被隐式转为字符串),返回全大写结果。它不修改原字段,只是计算时转换。
- 如果传入
NULL,结果仍是NULL,不是空字符串 - 中文、日文、俄文字母等非 ASCII 字符不受影响,只对 ASCII 字母(a–z)生效
- 数字和符号原样保留,比如
UPPER('hello123!')→'HELLO123!'
WHERE里用UPPER做大小写不敏感匹配很危险
想查邮箱时不区分大小写?别直接写 WHERE UPPER(email) = UPPER('User@ExAmPlE.com') —— 这会让索引失效,哪怕 email 字段有索引也会全表扫描。
- 更安全的做法是:确保字段本身用
utf8mb4_unicode_ci或utf8mb4_0900_as_cs以外的 collation(比如utf8mb4_general_ci),直接WHERE email = 'User@ExAmPlE.com'就自动忽略大小写 - 如果必须用 UPPER(比如要统一输出),至少把函数放在右边:
WHERE email = UPPER('User@ExAmPlE.com')不行,还是得左边也 UPPER —— 所以真要模糊查,优先改 collation,而不是靠函数兜底
和 LOWER、UCASE 的区别在哪
UPPER 和 UCASE 完全等价,MySQL 文档里说 UCASE 是 UPPER 的同义词,二者行为、性能、兼容性毫无差别。别纠结选哪个,团队统一就行。
-
LOWER是反向操作,但注意:某些字符在不同 collation 下大小写映射不一致(比如土耳其语的 ‘i’),MySQL 默认不处理这类 locale 特殊规则 - 别试图用
UPPER(UPPER(str))做“双重保险”——没用,也不会报错,纯属冗余
批量更新字段为大写时要注意什么
执行 UPDATE user SET name = UPPER(name) 看似简单,但容易漏掉几件事:
- 先确认
name字段长度是否足够——比如原来是VARCHAR(20),而某些 UTF8 字符(如 emoji)在 UPPER 后可能占更多字节,不过纯字母一般不会溢出 - 如果该字段有唯一约束,
UPPER('Abc')和UPPER('ABC')结果一样,可能导致重复键冲突 - 建议加
WHERE name != UPPER(name)条件,避免无意义的更新触发 binlog 和从库重放
UPPER 更轻量、更可靠。











