news 2026/4/18 14:30:33

MySQL 5.7 转 Oracle 实习生核心注意事项(企业常见场景)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MySQL 5.7 转 Oracle 实习生核心注意事项(企业常见场景)

作为从 MySQL 转 Oracle 的实习生,核心难点是语法差异、函数差异、规范差异,以下是企业开发中高频遇到的问题和注意事项,按优先级排序。

(一) 基础语法与数据类型差异(最易踩坑)

  1. 字符串连接符不同

    • MySQL:支持CONCAT()函数或||(部分版本需配置),更常用CONCAT()
    • Oracle:不支持CONCAT()多参数拼接(仅支持 2 个参数),主流使用||作为字符串连接符,多参数拼接需嵌套CONCAT()或用||串联。

    sql

    -- MySQL 写法 SELECT CONCAT('姓名:', emp_name, ',部门:', dept_name) FROM emp; -- Oracle 写法(二选一) SELECT '姓名:' || emp_name || ',部门:' || dept_name FROM emp; -- 推荐,简洁 SELECT CONCAT(CONCAT('姓名:', emp_name), ',部门:', dept_name) FROM emp; -- 仅支持 2 个参数,嵌套麻烦
  2. 数据类型对应与注意点

    • 整数类型:MySQL 的INT对应 Oracle 的NUMBER(10),MySQL 的BIGINT对应 Oracle 的NUMBER(19),Oracle 无INT/BIGINT原生类型(虽可兼容书写,但本质是NUMBER)。
    • 字符串类型:MySQL 的VARCHAR对应 Oracle 的VARCHAR2Oracle 不推荐使用VARCHAR,优先用VARCHAR2,两者目前功能一致,但后续版本可能差异化);MySQL 的TEXT对应 Oracle 的CLOB(大文本)。
    • 日期类型:MySQL 的DATETIME对应 Oracle 的DATE(Oracle 的DATE包含年月日时分秒,与 MySQL 不同),Oracle 还有TIMESTAMP(更高精度,支持毫秒),无DATETIME类型。
  3. 分页语法差异(企业查询高频场景)

    • MySQL:使用LIMIT 起始行, 每页条数,简洁直观。
    • Oracle:无LIMIT关键字,企业常用两种分页方式,实习生优先掌握ROWNUM嵌套分页(兼容所有版本)。

    sql

    -- MySQL 分页:查询第 11-20 条数据(每页 10 条,第 2 页) SELECT * FROM emp ORDER BY emp_id LIMIT 10, 10; -- Oracle 分页(ROWNUM 嵌套,推荐):查询第 11-20 条数据 SELECT t.* FROM ( SELECT e.*, ROWNUM rn FROM emp e ORDER BY emp_id -- 内层查询生成行号 ) t WHERE t.rn BETWEEN 11 AND 20; -- 外层查询筛选行号范围
  4. 注释语法差异(规范问题)

    • 单行注释:两者都支持-- 注释内容(注意 Oracle 中--后必须加空格,否则报错,MySQL 无此要求)。
    • 多行注释:两者都支持/* 注释内容 */,无差异。
    • 额外:Oracle 支持REM注释(仅用于脚本文件,终端执行有效,不推荐在业务 SQL 中使用)。

(二) 函数差异(企业开发高频使用)

  1. 日期函数(核心差异,极易踩坑)

    • 获取当前时间:
      • MySQL:NOW()(获取当前年月日时分秒)、CURDATE()(仅年月日)。
      • Oracle:SYSDATE(无括号!获取当前年月日时分秒,最常用)、SYSTIMESTAMP(高精度,含毫秒)。
    • 日期格式化:
      • MySQL:DATE_FORMAT(日期字段, '格式字符串')
      • Oracle:TO_CHAR(日期字段, '格式字符串')(格式化日期为字符串)、TO_DATE(字符串, '格式字符串')(格式化字符串为日期,必须指定格式,否则报错)。

    sql

    -- MySQL:格式化当前时间为 '2026-02-04 15:30:00' SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s'); -- Oracle:格式化当前时间为 '2026-02-04 15:30:00' SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') FROM DUAL; -- HH24 表示 24 小时制,HH 是 12 小时制 -- Oracle:字符串转日期(必须指定格式,与字符串格式匹配) SELECT TO_DATE('2026-02-04', 'YYYY-MM-DD') FROM DUAL;
    • 日期加减:
      • MySQL:DATE_ADD(日期, INTERVAL 1 DAY)(加 1 天)。
      • Oracle:直接加减数字(单位为天),SYSDATE + 1(加 1 天)、SYSDATE - 0.5(减 12 小时),如需按月 / 年加减,使用ADD_MONTHS(日期, 1)(加 1 个月)。
  2. 空值处理函数

    • MySQL:IFNULL(字段, 默认值)(字段为空则返回默认值)。
    • Oracle:NVL(字段, 默认值)(对应 MySQL 的IFNULL,最常用)、NVL2(字段, 非空返回值, 空返回值)(扩展功能,企业偶尔使用)。

    sql

    -- MySQL:员工奖金为空则返回 0 SELECT emp_name, IFNULL(bonus, 0) FROM emp; -- Oracle:员工奖金为空则返回 0 SELECT emp_name, NVL(bonus, 0) FROM emp;
  3. 聚合函数与分组查询(规范差异)

    • 核心差异:Oracle 的GROUP BY子句中,必须包含所有非聚合函数的查询字段,MySQL (5.7 若关闭only_full_group_by配置)允许非聚合字段不出现在GROUP BY中,这是企业开发中实习生最易报错的点之一。

    sql

    -- MySQL (关闭 only_full_group_by):可正常执行 SELECT dept_id, emp_name, SUM(salary) FROM emp GROUP BY dept_id; -- Oracle:报错(emp_name 是非聚合字段,未出现在 GROUP BY 中) SELECT dept_id, emp_name, SUM(salary) FROM emp GROUP BY dept_id; -- Oracle:正确写法(非聚合字段 emp_name 加入 GROUP BY,或去掉 emp_name) SELECT dept_id, SUM(salary) FROM emp GROUP BY dept_id; -- 推荐,符合业务需求

(三) 企业开发规范与常见问题(实习生必备)

  1. 必须使用FROM DUAL表(无表查询时)Oracle 要求所有SELECT语句必须包含FROM子句,若查询无具体数据表(如格式化当前时间、计算常量),必须使用系统内置的DUAL虚表,MySQL 无此要求。

    sql

    -- MySQL:无表查询,正常执行 SELECT NOW(); -- Oracle:无表查询,必须加 FROM DUAL SELECT SYSDATE FROM DUAL;
  2. 大小写敏感问题(规范要求)

    • Oracle:字段名、表名若不使用双引号包裹,默认不区分大小写(存储为大写);字符串查询区分大小写(与 MySQL 不同,MySQL 默认不区分)。
    • 企业规范:实习生开发时,表名、字段名统一使用大写(或小写,保持一致),字符串查询若需不区分大小写,使用UPPER()(转大写)或LOWER()(转小写)函数。

    sql

    -- Oracle:查询姓名为 "zhangsan",若数据库中存储为 "ZhangSan",直接查询无结果 SELECT * FROM emp WHERE emp_name = 'zhangsan'; -- Oracle:不区分大小写查询(推荐,企业常用) SELECT * FROM emp WHERE UPPER(emp_name) = UPPER('zhangsan');
  3. 事务处理差异

    • MySQL:默认事务隔离级别为REPEATABLE READ,支持AUTOCOMMIT=1(自动提交事务,执行INSERT/UPDATE/DELETE后立即生效)。
    • Oracle:默认事务隔离级别为READ COMMITTED默认AUTOCOMMIT=0(不自动提交事务),执行INSERT/UPDATE/DELETE后,必须手动执行COMMIT(提交事务)或ROLLBACK(回滚事务),否则数据仅在当前会话可见,关闭会话后数据丢失,这是实习生最易犯的 “数据插入后看不到” 的问题。
  4. 序列(Sequence)替代自增主键(企业核心)

    • MySQL:支持AUTO_INCREMENT关键字,直接设置字段为自增主键。
    • Oracle:AUTO_INCREMENT关键字,企业中通过「序列(Sequence)+ 触发器(Trigger)」实现自增主键,实习生需了解序列的基本使用(无需手动创建,只需调用序列获取自增值)。

    sql

    -- Oracle:调用序列获取下一个自增值(企业中序列名通常为 表名_SEQ) SELECT emp_seq.NEXTVAL FROM DUAL; -- 获取下一个值 SELECT emp_seq.CURRVAL FROM DUAL; -- 获取当前值(需先调用过 NEXTVAL)
  5. 常见报错与快速排查(实习生必记)

    • ORA-00942: 表或视图不存在:① 表名 / 字段名拼写错误;② 无该表的查询权限(联系 DBA 授权);③ 未指定表空间(企业表通常归属具体用户,需加用户前缀,如SCOTT.EMP)。
    • ORA-01722: 无效数字:① 字符串字段与数字类型进行运算;② 字符串转数字失败(如TO_NUMBER('abc'))。
    • ORA-00001: 违反唯一约束条件:插入 / 更新的数据违反了主键或唯一索引的唯一性要求(排查是否插入重复数据)。

三、 总结

  1. IN子句超 1000 条优先用「拆分INOR」或「临时表JOIN」解决,后者更适合企业生产环境。
  2. 从 MySQL 转 Oracle,核心要攻克「语法差异(分页、FROM DUAL)、函数差异(日期、空值)、规范差异(GROUP BY、事务提交)」。
  3. 实习生开发时,优先遵循企业命名规范,遇到报错先排查拼写、数据类型、权限问题,再对照语法差异调整。

掌握以上内容,可快速适配 Oracle 企业开发,避免 80% 以上的新手踩坑。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 6:30:29

基于Springboot+Vue的校园设备维护报修系统源码文档部署文档代码讲解等

课题介绍 本课题旨在设计并实现一套基于SpringBootVue的前后端分离校园设备维护报修系统,解决校园内设备故障报修流程繁琐、维修进度不透明、设备信息管理混乱、维修资源调配不合理等问题。系统采用SpringBoot作为后端核心框架,结合MyBatis-Plus简化数据…

作者头像 李华
网站建设 2026/4/18 6:25:19

基于Springboot+Vue的校园信息共享系统源码文档部署文档代码讲解等

课题介绍 本课题旨在设计并实现一套基于SpringBootVue的前后端分离校园信息共享系统,解决校园内各类信息分散杂乱、传播效率低、信息审核不规范、师生获取精准信息不便等问题。系统采用SpringBoot作为后端核心框架,结合MyBatis-Plus简化数据操作&#xf…

作者头像 李华
网站建设 2026/4/18 6:26:15

使用 Zensical 快速搭建静态博客网站(类似Hugo、Hexo)

从零到一,快速搭建你的 Zensical 博客 Zensical 官方网站: https://zensical.org/ Zensical 官方文档: https://zensical.org/docs/ 第一步:环境准备 检查 Python 版本 Zensical 需要 Python 3.8 或更高版本。首先检查你的 Python 版本: …

作者头像 李华
网站建设 2026/4/18 7:52:33

大数据毕设项目:基于Hadoop的某篮球队各个球员数据分析系统的设计与实现(源码+文档,讲解、调试运行,定制等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/4/18 8:09:29

基于opencv与深度学习Deeplab舌苔分割检测代码及教程 深度学习图像分割 舌苔分割图像数据集

深度学习Deeplab舌苔分割检测代码及教程 引言 舌苔分割是中医诊断中的一个重要环节,通过对舌苔的分析可以辅助医生了解患者的健康状况。近年来,深度学习技术在医学图像处理领域取得了显著进展,Deeplab系列模型因其卓越的分割性能而被广泛应…

作者头像 李华