一、MySQL
1. 大小写敏感机制
-
MySQL 的大小写敏感由
lower_case_table_names系统变量控制。 -
该变量影响表名和数据库名 的存储和比较方式,列名、索引名等不受此变量影响(列名在 SQL 语句中通常不区分大小写,取决于底层字符集排序规则)。
-
值含义:
-
0:大小写敏感(表名按给定大小写存储,比较时区分大小写)。仅 Unix/Linux 默认值。 -
1:大小写不敏感(表名存储为小写,比较时也不区分大小写)。Windows 默认值。 -
2:表名按给定大小写存储,但比较时转为小写(macOS 默认值)。
-
2. 如何开启大小写敏感[mysqld]
lower_case_table_names = 0
- 重要:修改此变量后必须重启 MySQL 服务,且只能在初始化数据库前设置(或在新实例中设置)。若已存在数据,修改可能导致数据无法访问。
3. SQL 语句编写注意事项-- 如果实际表名为 MyTable,以下语句会报错
SELECT * FROM mytable; -- 错误
SELECT * FROM MyTable; -- 正确
- 列名在 SQL 中通常可以任意大小写,因为 MySQL 默认不区分列名大小写,除非列使用了区分大小写的排序规则(如 utf8mb4_bin)。
二、PostgreSQL(PG)
1. 大小写敏感机制
-
PostgreSQL 对未加引号的标识符(表名、列名等)会自动转换为小写,因此实际上不区分大小写。
-
若需要大小写敏感(即保留并区分大小写),必须使用双引号将标识符括起来。
-
一旦使用双引号,该标识符就成为"引用标识符",之后每次引用时都必须使用完全相同的大小写和双引号。
2. 如何开启大小写敏感
-
PostgreSQL 没有全局开关来改变默认折叠行为。大小写敏感是通过在 SQL 中显式使用双引号实现的。
-
如果希望所有标识符都区分大小写,必须在创建表和查询时始终使用双引号。
3. SQL 语句编写注意事项CREATE TABLE MyTable (id INT); -- 实际表名存储为 mytable
SELECT * FROM MyTable; -- 正确,MyTable 转为小写
SELECT * FROM mytable; -- 正确
SELECT * FROM "MyTable"; -- 错误,实际表名是 mytable,不是 MyTableCREATE TABLE "MyTable" (id INT); -- 表名存储为 MyTable
SELECT * FROM "MyTable"; -- 必须使用双引号且大小写匹配
SELECT * FROM MyTable; -- 错误,未引用会转为小写 mytableCREATE TABLE t ("MyColumn" INT);
SELECT "MyColumn" FROM t; -- 正确
SELECT mycolumn FROM t; -- 错误,未引用会转为小写 mycolumn
三、Oracle
1. 大小写敏感机制
-
Oracle 默认将未加引号的标识符转换为大写存储,因此不区分大小写。
-
使用双引号时,标识符会保留原样(包括大小写),此时大小写敏感。
2. 如何开启大小写敏感
-
Oracle 没有全局配置,同样通过使用双引号来控制。
-
注意:一旦使用双引号创建对象(如表、列),后续所有引用都必须使用双引号且大小写完全一致。
3. SQL 语句编写注意事项CREATE TABLE MyTable (id NUMBER); -- 实际表名 MYTABLE,列名 ID
SELECT * FROM MyTable; -- 正确,MyTable 转为 MYTABLE
SELECT * FROM mytable; -- 正确,转为 MYTABLE
SELECT * FROM "MyTable"; -- 错误,实际表名是 MYTABLE,不是 MyTable
REATE TABLE "MyTable" (id NUMBER); -- 表名存储为 MyTable
SELECT * FROM "MyTable"; -- 必须使用双引号且大小写匹配
SELECT * FROM MyTable; -- 错误,转为 MYTABLE
REATE TABLE t ("MyColumn" NUMBER);
SELECT "MyColumn" FROM t; -- 正确
SELECT mycolumn FROM t; -- 错误,转为 MYCOLUMN
四、对比总结
| 数据库 | 默认行为 | 如何开启大小写敏感 | SQL 编写区别 |
|---|---|---|---|
| MySQL | 取决于 lower_case_table_names 值 |
修改系统变量(需重启,影响全局) | 敏感时表名/库名必须与存储一致;列名通常不敏感,除非排序规则区分。 |
| PG | 未引用标识符转为小写 | 使用双引号括起标识符 | 引用标识符必须大小写完全匹配;未引用标识符自动转为小写。 |
| Oracle | 未引用标识符转为大写 | 使用双引号括起标识符 | 引用标识符必须大小写完全匹配;未引用标识符自动转为大写。 |
五、建议
-
跨数据库兼容性:若应用需要同时支持多种数据库,建议遵循 SQL 标准:使用全部大写或全部小写命名标识符,避免使用双引号(除非必须保留大小写),这样在不同数据库中行为最一致。
-
MySQL 特殊处理 :若要在生产环境中开启大小写敏感,请确保在初始化数据库前设置
lower_case_table_names=0,避免中途修改导致数据错乱。 -
PG/Oracle 引用标识符:使用双引号会使代码变得繁琐且容易出错,除非有特殊需求(如混合大小写或关键字作标识符),否则应尽量避免。
为了避免数据库兼容性,因此建库统一采用小写