SQL字符串比较是否区分大小写取决于数据库默认排序规则及字段配置:MySQL默认不区分,PostgreSQL默认区分,SQL Server和Oracle依赖安装设置;可通过查看字段collation判断,也可在查询或建表时显式指定。

SQL 中字符串比较是否区分大小写,取决于数据库系统的默认排序规则(collation)以及具体字段或查询中指定的 collation。不是所有数据库都一样,也不能一概而论。
不同数据库的默认行为
MySQL 默认使用 不区分大小写 的排序规则(如 utf8mb4_0900_ai_ci),所以 'abc' = 'ABC' 返回 TRUE;PostgreSQL 默认是 区分大小写 的,'abc' = 'ABC' 为 FALSE;SQL Server 和 Oracle 行为则依赖于安装时设置的 collation 或数据库/列级配置。
如何判断当前字段是否区分大小写
可以查看字段的排序规则定义:
- MySQL:执行
SHOW FULL COLUMNS FROM table_name LIKE 'column_name';,看Collation列是否含_ci(case-insensitive)或_cs/_bin(case-sensitive) - PostgreSQL:运行
SELECT collname, collcollate, collctype FROM pg_collation WHERE collname = 'default';,或查表定义中的COLLATE子句 - SQL Server:用
SELECT COLUMN_NAME, COLLATION_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'xxx';
临时让比较区分或不区分大小写
可以在查询中显式指定 collation 或使用函数来控制:
- MySQL:用
COLLATE utf8mb4_0900_as_cs强制区分大小写,例如WHERE name COLLATE utf8mb4_0900_as_cs = 'Admin' - PostgreSQL:用
ILIKE实现不区分大小写的模糊匹配,或加COLLATE "C"强制二进制比较(区分大小写) - 通用方法:用函数如
UPPER()或LOWER()统一转换再比较,例如WHERE UPPER(name) = UPPER('admin')
建表时指定排序规则更可靠
比起每次查询都加修饰,更推荐在定义字段时就明确 collation:
- MySQL:
name VARCHAR(50) COLLATE utf8mb4_0900_as_cs - PostgreSQL:
name TEXT COLLATE "C" - SQL Server:
name NVARCHAR(50) COLLATE SQL_Latin1_General_CP1_CS_AS
这样逻辑清晰,性能也更好,避免隐式转换带来的不确定性。










