mysql、pg、oracel数据库迁移避坑指南 一、MySQL1. 大小写敏感机制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。二、PostgreSQLPG1. 大小写敏感机制PostgreSQL 对未加引号的标识符表名、列名等会自动转换为小写因此实际上不区分大小写。若需要大小写敏感即保留并区分大小写必须使用双引号将标识符括起来。一旦使用双引号该标识符就成为“引用标识符”之后每次引用时都必须使用完全相同的大小写和双引号。2. 如何开启大小写敏感PostgreSQL没有全局开关来改变默认折叠行为。大小写敏感是通过在 SQL 中显式使用双引号实现的。如果希望所有标识符都区分大小写必须在创建表和查询时始终使用双引号。3. SQL 语句编写注意事项CREATE TABLE MyTable (id INT); -- 实际表名存储为 mytableSELECT * FROM MyTable; -- 正确MyTable 转为小写 SELECT * FROM mytable; -- 正确 SELECT * FROM MyTable; -- 错误实际表名是 mytable不是 MyTableCREATE TABLE MyTable (id INT); -- 表名存储为 MyTableSELECT * FROM MyTable; -- 必须使用双引号且大小写匹配 SELECT * FROM MyTable; -- 错误未引用会转为小写 mytableCREATE TABLE t (MyColumn INT);SELECT MyColumn FROM t; -- 正确 SELECT mycolumn FROM t; -- 错误未引用会转为小写 mycolumn三、Oracle1. 大小写敏感机制Oracle 默认将未加引号的标识符转换为大写存储因此不区分大小写。使用双引号时标识符会保留原样包括大小写此时大小写敏感。2. 如何开启大小写敏感Oracle没有全局配置同样通过使用双引号来控制。注意一旦使用双引号创建对象如表、列后续所有引用都必须使用双引号且大小写完全一致。3. SQL 语句编写注意事项CREATE TABLE MyTable (id NUMBER); -- 实际表名 MYTABLE列名 IDSELECT * FROM MyTable; -- 正确MyTable 转为 MYTABLE SELECT * FROM mytable; -- 正确转为 MYTABLE SELECT * FROM MyTable; -- 错误实际表名是 MYTABLE不是 MyTableREATE TABLE MyTable (id NUMBER); -- 表名存储为 MyTable SELECT * FROM MyTable; -- 必须使用双引号且大小写匹配 SELECT * FROM MyTable; -- 错误转为 MYTABLEREATE 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_names0避免中途修改导致数据错乱。PG/Oracle 引用标识符使用双引号会使代码变得繁琐且容易出错除非有特殊需求如混合大小写或关键字作标识符否则应尽量避免。为了避免数据库兼容性因此建库统一采用小写