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

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

相关推荐
2301_813599552 小时前
如何监控表空间自动扩展_DBA_DATA_FILES中的MAXBYTES分析
jvm·数据库·python
我不听你讲话2 小时前
Redis 配置与优化核心内容总结
数据库·redis·缓存
生万千欢喜心2 小时前
linux 安装 人大金仓数据库
linux·运维·数据库
m0_716430072 小时前
mysql数据库表名区分大小写吗_通过lower case table names配置
jvm·数据库·python
Wy_编程2 小时前
redis 客户端编程
数据库·redis·缓存
傻啦嘿哟2 小时前
Python多进程编程:用multiprocessing突破GIL限制
服务器·网络·数据库
看我干嘛!2 小时前
mysql主从配置一主一从
数据库·mysql
@insist1232 小时前
网络工程师-网络规划与设计(三):数据中心机房设计规范全解析
服务器·网络·数据库·网络工程师·软考·软件水平考试
2401_835956812 小时前
如何利用SQL子查询进行实时监控数据分析_性能优化
jvm·数据库·python
一只大袋鼠2 小时前
Java JDBC 封装:从原生写法到工具类封装 + 增删改查
java·开发语言·数据库·mysql