-- MySQL: 建表指定存储引擎CREATETABLE t1 (id INT)ENGINE=InnoDB;-- Oracle: 建表指定表空间CREATETABLE t1 (id NUMBER)TABLESPACE users;
4. 命名空间 (Namespace) ⭐
概念
MySQL
Oracle
核心区别
对象重名
表、视图、存储过程可同名
表、视图、过程不可同名
⚠️ 冲突规则
范围
数据库内唯一
用户 (Schema) 内唯一
类似
MySQL:在同一个库中,可以有一个表叫 test,同时有一个存储过程也叫 test。
Oracle:在同一个用户(Schema)下,表、视图、序列、存储过程共享命名空间。
如果有表 EMP,就不能创建视图 EMP 或过程 EMP。
索引有独立的命名空间(可以和表同名,但不建议)。
-- MySQL: ✅ 允许CREATETABLE test (id INT);CREATEPROCEDURE test()BEGINEND;-- Oracle: ❌ 报错 ORA-00955CREATETABLE test (id NUMBER);CREATEVIEW test ASSELECT*FROM dual;-- 名称已由现有对象使用
-- MySQLCREATETABLE t (id INTAUTO_INCREMENTPRIMARYKEY);-- Oracle (12c 之前)CREATE SEQUENCE t_seq;INSERTINTO t VALUES(t_seq.NEXTVAL);-- Oracle (12c 之后)CREATETABLE t (id NUMBER GENERATED ALWAYS ASIDENTITYPRIMARYKEY);
6. 空值处理 (NULL Handling) ⚠️
概念
MySQL
Oracle
核心区别
空字符串
'' != NULL
'' = NULL
⚠️ 重大差异
长度
LENGTH('') = 0
LENGTH('') = NULL
逻辑不同
索引
空字符串可索引
NULL 不被普通索引存储
影响查询优化
MySQL:空字符串是有效的值,不等于 NULL。
Oracle:空字符串自动转换为 NULL。
影响:WHERE col = '' 在 Oracle 中永远查不到数据(应使用 IS NULL)。
影响:唯一索引允许多个 NULL 值(因为 NULL != NULL)。
-- MySQLSELECT*FROM t WHERE col ='';-- 能查到空字符串-- OracleSELECT*FROM t WHERE col ='';-- 查不到 (被当作 NULL)SELECT*FROM t WHERE col ISNULL;-- 才能查到
7. 大小写敏感 (Case Sensitivity)
概念
MySQL
Oracle
核心区别
表名
Linux 敏感,Windows 不敏感
默认不敏感 (转大写)
存储方式不同
标识符
保持原样
未加引号自动转大写
⚠️ 易踩坑
字符串
取决于 Collation
取决于比较设置
类似
MySQL:CREATE TABLE MyTab,查询时 SELECT * FROM MyTab 或 mytab (取决于配置)。
Oracle:
CREATE TABLE MyTab → 内部存储为 MYTAB。
SELECT * FROM MyTab → 自动转大写查询 MYTAB。
SELECT * FROM "MyTab" → 加引号区分大小写,内部存储为 MyTab(后续查询必须加引号)。