
SQL 中的大小写敏感性主要取决于数据库使用的字符集(Character Set)和排序规则(Collation),而不是 SQL 语句本身的语法。换句话说,表名、列名、字符串值的大小写是否敏感,由底层数据库配置决定,不同数据库系统表现也不同。
MySQL:默认不区分大小写,但可配置
MySQL 在 Windows 和 macOS 上默认使用 不区分大小写的排序规则(如 utf8mb4_0900_as_cs 以外的常见规则,例如 utf8mb4_general_ci 或 utf8mb4_0900_ai_ci),这意味着:
- 查询
SELECT * FROM User和SELECT * FROM user效果相同(前提是表名在磁盘上实际存在且大小写匹配) - 字符串比较
WHERE name = 'Alice'会匹配'alice'、'ALICE'(取决于 collation 的_ci后缀,即 case-insensitive) - 若用
_cs(case-sensitive)或_bin(binary)结尾的 collation(如utf8mb4_0900_as_cs),则字符串比较区分大小写
注意:MySQL 中的 数据库名和表名是否大小写敏感,还受系统变量 lower_case_table_names 控制。Linux 默认为 0(敏感),Windows/macOS 默认为 1(不敏感,自动转小写存储)。
PostgreSQL:标识符默认小写,字符串默认区分大小写
PostgreSQL 对大小写的处理更严格:
-
表名、列名等标识符默认不加引号时全部转为小写,所以
SELECT Name FROM Users实际执行的是SELECT name FROM users - 若建表时用了双引号定义大小写混合的名称(如
"UserName"),后续必须始终用双引号引用,否则报错 -
字符串值的比较默认区分大小写,即
'Apple' = 'apple'返回false;如需忽略大小写,可用ILIKE、LOWER()或指定 collation(如COLLATE "en_US.utf8")
SQL Server:依赖数据库级 collation 设置
SQL Server 的大小写行为完全由数据库或列的排序规则(collation)决定:
- 常见 collation 如
SQL_Latin1_General_CP1_CI_AS:其中CI表示 case-insensitive(不区分大小写),AS表示 accent-sensitive(区分重音) - 若用
_CS(case-sensitive),则WHERE col = 'Test'不会匹配'test' - 可在查询中临时指定 collation:
WHERE col COLLATE Latin1_General_CS_AS = 'Test'
通用建议:提升可移植性与可维护性
无论使用哪种数据库,以下做法能减少大小写相关问题:
- 统一使用小写字母命名数据库对象(表、列),避免引号或大小写混用
- 字符串比较逻辑明确时,显式使用
UPPER()/LOWER()或对应函数(如 PostgreSQL 的ILIKE) - 建库/建表时主动指定适合业务的 collation,而非依赖默认值
- 开发环境尽量模拟生产环境的字符集与排序规则设置,避免上线后出现意外行为










