mysql、pg、oracel数据库迁移避坑指南

一、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 引用标识符:使用双引号会使代码变得繁琐且容易出错,除非有特殊需求(如混合大小写或关键字作标识符),否则应尽量避免。

为了避免数据库兼容性,因此建库统一采用小写

相关推荐
Rsun045512 小时前
Redis中实现访问量计数
数据库·redis·缓存
西柚0012 小时前
Ubuntu22.04.5 + Docker + MySQL 5.7
mysql·docker·容器
天空属于哈夫克33 小时前
自动化素材中枢:实现云端文件与外部群消息的异步同步方案
数据库·oracle
Navicat中国3 小时前
Navicat Premium Lite 正式登录鸿蒙应用市场
数据库·华为·harmonyos·navicat
Yvonne爱编码3 小时前
数据库---Day 1 数据库基础
数据库·mysql·oracle
Ricky_Theseus3 小时前
数据库关系代数 - 连接操作
linux·数据库·算法
FL4m3Y4n3 小时前
MySQL索引原理与SQL优化
android·sql·mysql
2301_793804693 小时前
定时任务专家:Python Schedule库使用指南
jvm·数据库·python
guslegend3 小时前
MySQL高手第三章
数据库·mysql