应根据Oracle版本和监听器注册信息选择:12c及以上多租户环境优先填服务名(如ORCLPDB1),仅当lsnrctl status显示SID且无服务名时才填SID(如ORCL);填错导致ORA-12514等错误,需通过lsnrctl status确认实际注册名称。
服务名和SID不是可互换的别名,它们指向数据库的不同抽象层级:SID标识一个具体的数据库实例(比如ORCL),而服务名是Oracle监听器对外暴露的逻辑服务标识(比如ORCLPDB1或orcl.example.com)。从Oracle 12c起,尤其启用多租户(CDB/PDB)后,绝大多数新部署默认只注册服务名,不注册SID。直接填SID反而会连不上。
判断依据不是“习惯”或“教程示例”,而是你实际数据库的监听状态。最可靠的方法是登录服务器执行:
lsnrctl status
观察输出中Services Summary部分:
Service "ORCLPDB1" has 1 instance(s) —— 填 ORCLPDB1(服务名)Instance "ORCL", status READY 且没有服务名条目 —— 才考虑填 ORCL(SID)常见错误信息包括:ORA-12514: TNS:listener does not currently know of service requested in connect descriptor 或 Navicat提示“连接超时”但用户名密码无误。这时不要反复试错,立刻做两件事:
lsnrctl status,若提示“TNS-12541: No listener”,先启动监听:lsnrctl start
ORCL ≠ orcl ≠ ORCL.local
TNS,手动配置tnsnames.ora,把服务名/SID封装进别名,绕过Basic模式的字段歧义即使服务名填对,若Navicat加载的oci.dll版本与Oracle服务器不兼容(比如用10g的oci.dll连19c数据库),会出现Cannot create oci environment或静默失败。这不是服务名问题,但会让人误以为填错了。
oci.dll(如12.1.0.2或19.21.0.0)右键oci.dll → 属性 → 详细信息 → 文件版本
oci.dll,混用必报Access violation
lsnrctl status,比反复修改Navicat表单快得多。