SQL 中字符串比较是否区分大小写?

11次阅读

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

SQL 中字符串比较是否区分大小写?

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

这样逻辑清晰,性能也更好,避免隐式转换带来的不确定性。

text=ZqhQzanResources