数据库连接串与驱动对比
连接串不只是“地址加密码”。它同时表达协议、拓扑入口、目标命名空间、身份认证、TLS 校验和会话行为。相似的字符串可能使用完全不同的网络协议;有些云数据库和宽列数据库则根本没有跨语言通用 URI。
示例不含真实凭证
下面的 USER、主机名、项目名和数据库名都是占位符。生产环境应通过环境变量、Secret Manager、工作负载身份或驱动属性传入凭证,不要把密码提交到仓库,也不要让它出现在日志、异常或进程参数中。
| 数据库 | 形式 / 端口 | 代表性模板 | 命名空间与关键差异 |
|---|---|---|---|
| PostgreSQL关系型 | URIPostgreSQL wire / libpq默认端口 5432 | postgresql://USER@db.example:5432/app?sslmode=verify-fullTLS:sslmode=verify-full | 路径是 database;schema 在会话内选择 libpq 同时支持 URI 与 key=value;多主机、证书路径和 application_name 都可作为参数。 官方连接文档 ↗ |
| MySQL关系型 | JDBCMySQL classic protocol默认端口 3306 | jdbc:mysql://db.example:3306/app?sslMode=VERIFY_IDENTITYTLS:sslMode=VERIFY_IDENTITY | 路径是 database/schema URI 形式取决于驱动;Connector/J 还提供 loadbalance、replication 和 SRV 子协议。 官方连接文档 ↗ |
| MariaDB关系型 | JDBCMariaDB/MySQL protocol默认端口 3306 | jdbc:mariadb://db.example:3306/app?sslMode=verify-fullTLS:sslMode=verify-full | 路径是 database MariaDB Connector/J 3.x 默认只接受 jdbc:mariadb:;不要假定 MySQL 驱动参数完全相同。 官方连接文档 ↗ |
| SQLite关系型 | 嵌入式文件 URI / 进程内 API默认端口 — | file:./data/app.db?mode=rwcTLS:不适用 | 路径就是数据库文件;main/temp 是 schema 没有服务器、用户和网络端口;URI 参数是否启用取决于宿主绑定和编译选项。 官方连接文档 ↗ |
| Microsoft SQL Server关系型 | JDBCTDS默认端口 1433 | jdbc:sqlserver://db.example:1433;databaseName=app;encrypt=true;trustServerCertificate=falseTLS:encrypt=true + 证书校验 | databaseName;schema 通常为 dbo 或用户默认值 JDBC 属性使用分号;实例名、集成认证和 Azure 身份认证是不同连接路径。 官方连接文档 ↗ |
| Oracle Database关系型 | JDBCOracle Net / JDBC Thin默认端口 1521 | jdbc:oracle:thin:@tcps://db.example:1521/app_serviceTLS:TCPS + wallet/信任库 | 末段通常是 service name,不是 SID 优先 service name 与 Easy Connect Plus;RAC/多主机通常需要扩展 Easy Connect 或描述符。 官方连接文档 ↗ |
| DuckDB分析与分布式 | 嵌入式进程内 API / JDBC默认端口 — | jdbc:duckdb:./data/analytics.duckdbTLS:不适用;远程文件由扩展处理 | 路径是本地文件;空路径创建内存库 DuckDB 不是远程数据库服务;数据库文件和进程资源属于宿主应用。 官方连接文档 ↗ |
| ClickHouse分析与分布式 | JDBCHTTPS / Native TCP默认端口 8123 / 9000 | jdbc:clickhouse:https://db.example:8443/analyticsTLS:HTTPS 或 secure native port | 路径是 database 客户端可能走 HTTP 或 Native 协议,端口、压缩和负载均衡参数不能混用。 官方连接文档 ↗ |
| TiDB分析与分布式 | JDBCMySQL protocol默认端口 4000 | jdbc:mysql://gateway.example:4000/app?sslMode=VERIFY_IDENTITYTLS:按 TiDB Cloud/自托管证书配置 | 路径是 database 使用 MySQL 兼容驱动,但认证插件、collation 和部分会话变量需要按 TiDB 文档确认。 官方连接文档 ↗ |
| CockroachDB分析与分布式 | URIPostgreSQL wire默认端口 26257 | postgresql://USER@cluster.example:26257/app?sslmode=verify-fullTLS:sslmode=verify-full + CA/客户端证书 | 路径是 database;schema 与 PostgreSQL 相近 协议兼容 PostgreSQL,但驱动/ORM 仍需验证事务重试和 CockroachDB 适配。 官方连接文档 ↗ |
| Snowflake分析与分布式 | JDBCHTTPS默认端口 443 | jdbc:snowflake://ORG-ACCOUNT.snowflakecomputing.com/?db=APP&schema=PUBLIC&warehouse=WH&role=ROLETLS:HTTPS;不要中间人替换证书 | account → database → schema;warehouse 是计算资源 用户、OAuth、密钥或工作负载身份应放 Properties/安全配置,不要把密码写入 URL。 官方连接文档 ↗ |
| BigQuery分析与分布式 | SDK 参数Google APIs / REST/gRPC默认端口 443 | project=PROJECT_ID; location=REGION; dataset=DATASETTLS:Google API HTTPS + ADC/OAuth | project → dataset → table 没有跨语言统一数据库 URI;JDBC/ODBC URL 由具体驱动定义,应用通常使用 ADC 与 SDK 配置。 官方连接文档 ↗ |
| MongoDBNoSQL | URIMongoDB wire / DNS SRV默认端口 27017 | mongodb+srv://USER@cluster.example/app?retryWrites=true&w=majorityTLS:SRV 默认启用 TLS | 路径是默认 authentication/database 上下文 优先 mongodb+srv;标准 mongodb:// 需要列出 seed hosts,并显式处理 replicaSet 与 TLS。 官方连接文档 ↗ |
| Apache CouchDBNoSQL | HTTPHTTP/JSON默认端口 5984 | https://db.example:6984/appTLS:生产使用 HTTPS 或 TLS 终止代理 | URL 路径就是 database;文档 ID 继续追加 认证更适合放 Authorization/Cookie 头;复制源和目标也以数据库 URL 表达。 官方连接文档 ↗ |
| RedisNoSQL | URIRESP默认端口 6379 | rediss://default@cache.example:6379/0TLS:rediss:// + CA/主机名校验 | 路径数字是逻辑 DB;Cluster 通常只使用 DB 0 URI 支持取决于客户端;Cluster/Sentinel 还需要拓扑发现参数,不能只看单节点地址。 官方连接文档 ↗ |
| ValkeyNoSQL | URIRESP默认端口 6379 | valkeys://default@cache.example:6379/0TLS:valkeys:// | 路径数字是逻辑 DB valkey-cli 使用 valkey:// 与 valkeys://;部分兼容客户端仍使用 redis:// / rediss://。 官方连接文档 ↗ |
| Amazon DynamoDBNoSQL | SDK 参数AWS JSON API over HTTPS默认端口 443 | region=ap-southeast-1; credentials=AWS default chainTLS:AWS HTTPS + SigV4 | AWS account + region → table 没有数据库连接 URI;SDK 根据 region、身份与 endpoint 构造并签名请求,本地模拟器才常覆写 endpoint。 官方连接文档 ↗ |
| Apache CassandraNoSQL | SDK 参数CQL native protocol默认端口 9042 | contactPoints=db1:9042,db2:9042; localDatacenter=dc1; keyspace=appTLS:驱动 SSL context + 节点证书 | cluster → keyspace → table 没有统一 URI;驱动需要 seed contact points 和 local datacenter,并自行发现拓扑。 官方连接文档 ↗ |
| ScyllaDBNoSQL | SDK 参数CQL native protocol默认端口 9042 | contactPoints=db1:9042,db2:9042; localDatacenter=dc1; keyspace=appTLS:驱动 SSL context + 节点证书 | cluster → keyspace → table 使用兼容 CQL 驱动;token-aware、DC-aware 负载均衡比把所有节点拼成 URL 更重要。 官方连接文档 ↗ |
| ElasticsearchNoSQL | HTTPHTTPS/JSON默认端口 9200 | https://search.example:9200TLS:HTTPS + CA fingerprint/证书 | URL/API 中选择 index 或 data stream 凭证通常单独使用 API key;Elastic Cloud 还提供 Cloud ID,但标准 endpoint URL 更通用。 官方连接文档 ↗ |
| OpenSearchNoSQL | HTTPHTTPS/JSON默认端口 9200 | https://search.example:9200TLS:HTTPS + CA;托管服务可能使用 SigV4 | URL/API 中选择 index 自托管通常 basic/cert,Amazon OpenSearch Service 常用 AWS SigV4;两者客户端配置不同。 官方连接文档 ↗ |
| Neo4jNoSQL | URIBolt + routing默认端口 7687 | neo4j+s://graph.example:7687TLS:neo4j+s:// 校验证书;neo4j+ssc:// 自签名 | database 通常由驱动 session 配置,不放 URI 路径 neo4j:// 启用路由发现,bolt:// 直连单个服务器;集群应用通常应使用 neo4j scheme。 官方连接文档 ↗ |
| InfluxDBNoSQL | HTTPHTTP API / FlightSQL(按产品)默认端口 8086 / 8181 | host=https://influx.example:8181; database=metrics; token=环境变量TLS:HTTPS + Bearer/Token header | 1.x database/RP;2.x org/bucket;3.x database 不同代际不是同一种连接串;token 应放环境变量或 secret store,而不是 URL 查询参数。 官方连接文档 ↗ |
| TimescaleDBNoSQL | URIPostgreSQL wire默认端口 5432 | postgresql://USER@ts.example:5432/app?sslmode=verify-fullTLS:sslmode=verify-full | database → schema;TimescaleDB 是扩展 连接方式与 PostgreSQL 相同;连接成功后仍需确认目标 database 已安装正确版本的 timescaledb 扩展。 官方连接文档 ↗ |
一条连接串通常包含什么
scheme://identity@host:port/namespace?transport_and_session_options| 部分 | 回答的问题 | 常见陷阱 |
|---|---|---|
| Scheme / 子协议 | 使用哪个驱动和网络协议? | jdbc: 之后还有产品子协议;https:// 不等于 SQL 协议 |
| Host / Seed list | 首次连接到哪里? | 集群通常需要 DNS SRV、seed hosts 或驱动拓扑发现,而不是永久固定单节点 |
| Port | 服务监听在哪里? | 云服务、TLS 代理、HTTP 与 Native 协议可能使用不同端口 |
| Namespace | 初始 database、schema、keyspace、dataset 或逻辑 DB 是什么? | 相同的 URL 路径在不同产品里含义不同 |
| Options | 如何处理 TLS、超时、路由和会话? | 参数名属于具体驱动,不能跨驱动照搬 |
六个容易忽略的知识点
1. URI、JDBC URL 与 DSN 不是同一种标准
PostgreSQL URI 常被多种语言复用;JDBC URL 只对特定 Java 驱动有意义;ODBC DSN 可能只是本机配置文件里的名字。复制连接串前先确认目标语言、驱动名称和主版本。
2. 特殊字符必须正确编码
用户名、密码、database 或查询参数中的 @、:、/、?、#、& 和空格可能改变 URI 结构。需要按驱动文档进行 percent-encoding;不要用手工字符串拼接代替驱动的配置对象。
3. “启用 TLS”不等于“验证了服务器身份”
生产配置应验证 CA 和主机名。trustServerCertificate=true、sslmode=require 或跳过 hostname verification 可能只加密流量,却没有防止连接到错误服务器。
4. 连接池参数通常不属于数据库连接串
最大连接数、连接寿命、空闲回收、健康检查和泄漏检测通常由 HikariCP、应用框架或驱动池配置。把连接池配置和服务端会话参数混在一条 URL 中,会让迁移和排障更困难。
5. 云服务优先使用短期身份
BigQuery、DynamoDB、Snowflake 等更适合使用 ADC、IAM、OAuth、密钥对或工作负载身份。一个能永久使用的用户名密码连接串通常意味着密钥轮换和最小权限做得不够好。
6. 可连接不代表语义兼容
TiDB 能使用 MySQL 驱动、CockroachDB 和 TimescaleDB 能使用 PostgreSQL 驱动,但 SQL、事务重试、系统表、扩展和参数仍有产品差异。协议兼容只解决“如何建立会话”,不保证应用行为完全一致。
建议的配置分层
非敏感地址:DB_HOST / DB_PORT / DB_NAME / DB_OPTIONS
身份与密钥:Secret Manager / Workload Identity / 短期 Token
驱动行为:连接超时、TLS CA、application name
连接池行为:最大连接、生命周期、空闲回收、健康检查这样既便于轮换凭证,也能把网络问题、认证问题、驱动问题和连接池问题分开排查。