pdo本身就是为多数据库兼容设计的,无需自行封装抽象层;dsn需严格按数据库类型构造,sql方言差异须手动处理,连接池与错误重试等需额外实现。
用 PDO 写多数据库兼容代码最实际的起点
直接上结论:不用自己封装抽象层,PDO 本身就是为这事设计的。它不绑定具体数据库,只要驱动装了、DSN 写对,mysql、pgsql、sqlite 甚至 sqlsrv 都能共用同一套 prepare/execute 流程。
DSN 构造必须按数据库类型严格区分
不同数据库的连接字符串(DSN)格式差异大,写错一个字符就报 PDOException: could not find driver 或 invalid data source name。不是语法问题,是协议层不认。
-
MySQL:mysql:host=localhost;dbname=test;charset=utf8mb4 -
PostgreSQL:pgsql:host=localhost;dbname=test;user=pguser;password=pgpass -
SQLite:sqlite:/path/to/db.sqlite(注意是绝对路径,相对路径容易找不到) -
SQL Server:sqlsrv:server=localhost;Database=test(Windows + SQLSRV 扩展,Linux 上得用pdo_odbc)
别试图用变量拼接 DSN——比如把 host 和 port 拆开再组合,PDO 不解析键值对,只认完整字符串格式。
跨库时要主动处理 SQL 方言差异
PDO 负责连接和参数绑定,但不翻译 SQL。比如分页、默认值、自动递增字段的写法,各库完全不同: