Navicat 17 连接 Oracle 应优先填服务名(Service Name)而非 SID,尤其在 12c+ 多租户环境中;不勾选“Use Oracle Client”时,SID 输入框实际按服务名处理,直接填写如 ORCLPDB1 等有效服务名即可。

Oracle连接时“SID”和“服务名”到底用哪个
Navicat 17 默认连接 Oracle 时,界面里显示的是 SID 输入框,但现代 Oracle 数据库(尤其是 12c 及以后版本)普遍启用多租户架构,SID 已不推荐使用;实际应填的是 服务名(Service Name)。如果填了旧式 SID 却连不上,大概率是服务名不匹配导致的认证失败或 TNS 连接超时。
在 Navicat 17 连接设置中启用服务名模式
Navicat 本身没有显式的「切换为服务名模式」开关,它靠字段含义和底层驱动行为区分——关键在于你是否勾选了 Use Oracle Client,以及填写的位置是否正确:
- 不勾选
Use Oracle Client(即使用内置轻量驱动):此时SID字段实际被当作Service Name处理,直接在该输入框填入你的服务名(如ORCL、ORCLPDB1或mydb.example.com)即可 - 勾选
Use Oracle Client:必须确保本地已安装 Oracle Instant Client,并且TNSNAMES.ORA文件配置正确;此时SID字段仍可填服务名,但更稳妥的方式是留空,改用Connection String(连接字符串)字段填写完整 TNS 格式,例如:ORCL = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 172.20.1.60)(PORT = 1521)) (CONNECT_DATA = (SERVICE_NAME = ORCL)))
- 若填了
SID却提示ORA-12154: TNS:could not resolve the connect identifier,说明 Navicat 尝试按 SID 解析,而监听器只注册了服务名——这时必须改填服务名并确认未启用强制 SID 模式
验证服务名是否正确的几种方法
别只信文档或别人给的字符串。真实服务名得从数据库侧确认,否则连通性永远悬着:
- 登录数据库服务器后执行:
SELECT value FROM v$parameter WHERE name = 'service_names'; - 查看监听器状态:
lsnrctl status,输出中Service "xxx" has 1 instance(s)的xxx才是有效服务名 - 注意大小写敏感:Oracle 服务名默认区分大小写,
orcl和ORCL是两个不同服务 - 容器数据库(CDB)下连 PDB,服务名通常是
PDB_NAME而非 CDB 名,比如ORCLPDB1,不是CDB$ROOT
容易被忽略的兼容性细节
Navicat 17 对 Oracle 23c 开发者版支持尚不完善,某些新服务名格式(如带域名后缀的 orcl23c.localdomain)可能触发解析异常。遇到连接卡在「正在连接…」时,优先降级尝试纯短名(如 orcl23c),再逐步加长验证。另外,tnsnames.ora 若存在多个同名 alias,Navicat 可能随机选取一个——务必检查文件中对应 alias 是否唯一且指向正确实例。


















