SQL大小写敏感问题_字符集与排序规则

1次阅读

SQL大小写敏感问题_字符集与排序规则

sql 中的大小写敏感性主要取决于数据库使用的字符集(Character Set)和排序规则(Collation),而不是 SQL 语句本身的语法。换句话说,表名、列名、字符串值的大小写是否敏感,由底层数据库配置决定,不同数据库系统表现也不同。

mysql:默认不区分大小写,但可配置

MySQL 在 windowsmacos 上默认使用 不区分大小写的排序规则(如 utf8mb4_0900_as_cs 以外的常见规则,例如 utf8mb4_general_ciutf8mb4_0900_ai_ci),这意味着:

  • 查询 select * FROM UserSELECT * 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;如需忽略大小写,可用 ILIKELOWER() 或指定 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,而非依赖默认值
  • 开发环境尽量模拟生产环境的字符集与排序规则设置,避免上线后出现意外行为
text=ZqhQzanResources