Oracle 与 MySQL substr 函数差异总结

核心坑点:Oracle substr 起始下标从 0 开始;MySQL substr/substring 起始下标从 1 开始,这是最容易踩的隐形 BUG。

你的 SQL 对照

Oracle

sql

sql 复制代码
if(i.source='CMS',substr(i.invoice_num,0,3),'') as reverse1

Oracle substr(str, start, len)

  • start=0:等价于从第1 位开始截取,取 3 个字符。

MySQL 错误写法(直接照搬 0 会出错)

sql

sql 复制代码
-- ❌错误:mysql substr start=0 返回空字符串!
if(i.source='CMS',substr(i.invoice_num,0,3),'') as reverse1 

MySQL 正确写法

sql

sql 复制代码
-- ✅正确:mysql下标从1开始,取前3位
if(i.source='CMS',substr(i.invoice_num,1,3),'') as reverse1 

所以你写的 substr(i.invoice_num,1,3) 是对的。


substr 完整对照表

表格

场景 Oracle substr MySQL substr / substring 说明
截取前 3 位 substr(col,0,3) substr(col,1,3) Oracle 0 等价 1;MySQL 传 0 得到空
从第 2 位开始取 4 位 substr(col,1,4) substr(col,2,4) 偏移全部差 1
倒数第 2 位取 2 字符 substr(col,-2,2) substr(col,-2,2) 负数下标两边行为一致

重点:负数索引两者完全一样,只有正数起始位差异巨大。

其他兼容坑(Oracle→MySQL)

  1. if 函数
  • Oracle 没有 if()函数,Oracle 用case when / decode
sql 复制代码
-- Oracle原生等价改写
case when i.source='CMS' then substr(i.invoice_num,0,3) else '' end as reverse1
  • MySQL 支持 if(条件,true值,false值),也支持 case when。
  1. 空字符串 '' vs null
  • Oracle:'' 等价 null;MySQL:''是空字符串,不等于null,迁移也要小心。
  1. 长度函数
  • Oracle:length()
  • MySQL:length()字节、char_length()字符;中文场景强烈建议用char_length。

兼容小建议

如果要一套 SQL 尽量兼容两边:

不要用 0 作为 substr 起始,Oracle 统一写substr(col,1,3),效果和substr(col,0,3)完全一样!

✅Oracle 也可以直接写 start=1,效果不变:

sql 复制代码
-- oracle中 substr(col,0,3) = substr(col,1,3)
substr(i.invoice_num,1,3)

这样 Oracle、MySQL 两边 SQL 写法完全一致,避免下标 0 陷阱。

最终两边统一版本(推荐)

sql 复制代码
case when i.source='CMS' then substr(i.invoice_num,1,3) else '' end as reverse1

使用 case when,同时兼容 Oracle 与 MySQL,消除 if 函数、下标 0 两个隐患。


踩坑复盘

这个坑属于静默错误:不会抛异常,只是返回空字符串,业务数据错了很难排查,测试很容易漏掉。

相关推荐
IvorySQL2 分钟前
PostgreSQL 日报|堆表选择性索引更新(10 月 13 日)
数据库·人工智能·postgresql·开源·区块链
Yyyyyy~5 分钟前
【Java】多线程初阶
java
蜗牛互联网6 分钟前
Java 17 调用视觉 Responses API:JSON 约束与人工复核路由
java·人工智能·后端
张洛闻Eren9 分钟前
Ansible【第一课】:Ansible介绍
运维·数据库·云原生·kubernetes·github·ansible
PC2005-cloud16 分钟前
Mysql学习笔记:InnoDB Cluster 集群从零搭建实战,基于 Docker 实现高可用读写分离架构
笔记·学习·mysql
深圳市益普科技有限公司1 小时前
中小封装厂上 MES,为什么十个项目九个坑?
大数据·数据库·人工智能
云边云科技_云网融合1 小时前
从 POS 机到访客 Wi-Fi:零售门店安全建设的完整解法
服务器·网络·数据库
SL_staff1 小时前
物模型三要素误用避坑指南:属性、事件、服务的正确建模逻辑
java
天行健,君子而铎1 小时前
知形-数据库风险监测系统:非侵入式、可溯源、差异化的数据库安全方案
网络·数据库·安全
这个DBA有点耶1 小时前
分布式事务深度:TCC空回滚、悬挂与Saga补偿风暴的根因与解法
数据库·mysql·代码规范