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

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

相关推荐
摇滚侠7 小时前
《On Java 中文版 基础卷》阅读笔记 实现隐藏 12
java·数据库·笔记
川石课堂软件测试8 小时前
学习软件测试需掌握的一些知识
数据库·python·sql·功能测试·网络协议·mysql·http
2501_937767169 小时前
自建 SQL 数据库定时备份踩坑复盘与落地思路
数据库·sql
silvamux_10 小时前
10款模型写种草笔记:可发布性、返工来源与成本数据缺口复盘
java·数据库·笔记
I Am a robert girl12 小时前
从 GameHorizon 拆解多时间尺度游戏评测:数据管线、离线基准与在线回放的三层设计
数据库·游戏·多时间尺度·数据管线·游戏评测·离线基准·在线回放
躺柒12 小时前
读数据安全架构设计与实践17安全架构案例(下)
数据库·安全·零信任·安全架构·防火墙·无边界
SelectDB12 小时前
实时更新排错现场:导入了却查到旧数据,和 FINAL 越加越慢的两条路
大数据·数据库·数据分析
SelectDB13 小时前
拿 Planet 的账单一行行对下来,我总结出三个可自查的校验点
大数据·数据库·数据分析
SelectDB13 小时前
Apache Doris + Vane:让多模态数据进入业务分析
大数据·数据库·数据分析
pjj1985414 小时前
ClickHouse 与 Doris 数据库技术梳理:看懂分析型数据库
数据库·clickhouse