mysql用collate实现大小写不敏感匹配需选_ci排序规则或显式指定,但临时collate可能导致索引失效;postgresql常用ilike或lower()配合函数索引;sql server依赖collate或upper/lower;跨库无统一标准方案,通常按主力数据库定制。

MySQL 中用 COLLATE 实现大小写不敏感匹配
MySQL 默认的 utf8mb4_general_ci 和 utf8mb4_0900_as_cs 等排序规则决定了比较行为。如果字段用的是 _ci(case-insensitive)结尾的 collation,比如 utf8mb4_unicode_ci,那 WHERE name = 'Alice' 就天然不区分大小写。但如果你的字段是 _cs(case-sensitive)或 _bin,就得显式指定:
SELECT * FROM users WHERE name COLLATE utf8mb4_unicode_ci = 'alice';注意:临时加
COLLATE 会导致该列无法走索引(除非索引本身建在相同 collation 上)。更稳妥的做法是在建表时就设对:CREATE TABLE users (name VARCHAR(50) COLLATE utf8mb4_unicode_ci);
PostgreSQL 中用 ILIKE 或 LOWER()
PostgreSQL 默认区分大小写,= 永远是大小写敏感的。最常用且语义清晰的是 ILIKE:
SELECT * FROM users WHERE name ILIKE 'alice';它支持通配符(
%、_),和 LIKE 行为一致,只是忽略大小写。如果要精确匹配又想兼容索引,可用 LOWER():SELECT * FROM users WHERE LOWER(name) = LOWER('Alice');但要注意:必须给 LOWER(name) 建函数索引才能高效:CREATE INDEX idx_users_lower_name ON users (LOWER(name));
SQL Server 中用 COLLATE 或内置函数
SQL Server 的排序规则(collation)绑定在列级或数据库级。若列是 SQL_Latin1_General_CP1_CI_AS(CI = case-insensitive),则直接 = 即可。否则,强制转换最直接:
SELECT * FROM users WHERE name COLLATE SQL_Latin1_General_CP1_CI_AS = 'alice';也可用
UPPER() 或 LOWER(),但不如 COLLATE 明确——尤其涉及 Unicode 或重音字符时,LOWER(N'café') 在某些 collation 下可能不等价于 N'café' 的小写形式。另外,COLLATE 不影响索引使用,只要目标 collation 与列定义兼容。跨数据库可移植写法的现实限制
没有标准 SQL 写法能保证所有数据库都大小写不敏感。ANSI SQL 的 LIKE 是区分大小写的,ILIKE 是 PostgreSQL 特有,COLLATE 语法虽被 MySQL/SQL Server/PostgreSQL 支持,但 collation 名称完全不同。如果必须写一次跑多库,只能退回到应用层处理:
- 查出来再用程序做
strings.EqualFold(Go)或str.lower() == pattern.lower()(Python) - 或者统一用
LOWER(col) = LOWER(?)并确保各库都有对应函数索引











