home Cloud computing and code文章正文

pdo_pgsql is different from pdo_mysql

Cloud computing and code 2026年02月03日 15:13 135 Pinwu

pdo_pgsql and pdo_mysql are database drivers for PDO, and they provide the same PDO interface, but have important differences in underlying connectivity and feature support.

book 1.jpg

 Similarities ✅

 1. Same PDO interface

// is used consistently, both PostgreSQL and MySQL
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = ?");
$stmt->execute([1]);
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);

2. Same core method

- 'prepare()', 'execute()', 'fetch()', 'fetchAll()'

- `beginTransaction()`, `commit()`, `rollback()`

- `lastInsertId()`, `errorInfo()`

 3. The same preprocessing statement supports

 Main differences ❌

 1. Connecting DSN formats are different

// PostgreSQL
$dsn = "pgsql:host=localhost; port=5432; dbname=mydb; user=postgres; password=secret";
// MySQL
$dsn = "mysql:host=localhost; port=3306; dbname=mydb; charset=utf8mb4";

2. SQL syntax difference

- LIMIT/OFFSET syntax is the same (both support 'LIMIT ?) OFFSET ?')

- Quotation mark identifiers: PostgreSQL uses double quotes, MySQL uses backtick

marks

- Data types: PostgreSQL has unique types such as arrays and JSONB

- Function differences: date functions, string functions, etc

 3. Preprocessing statements are implemented differently

// PostgreSQL supports naming parameters and question mark placeholders
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id OR name = ?");
 MySQL also supports it, but the underlying implementation mechanism is different

4. Transaction isolation level

-- PostgreSQL supports more levels of isolation
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
-- MySQL's  InnoDB also supports it, but the implementation is different

5. LAST_INSERT_ID()

// PostgreSQL - Sequence name needs to be specified
$lastId = $pdo->lastInsertId('users_id_seq');
 MySQL - Automatic fetching
$lastId = $pdo->lastInsertId();

6. Return result processing

// PostgreSQL returns a boolean value that may be 't'/'f'
$bool = $result['is_active'];   Conversion may be required
 MySQL typically returns 1/0 or true/false

code example comparison

 Connecting to the database

// PostgreSQL connection
$pdo_pg = new PDO(
    "pgsql:host=localhost; dbname=testdb",
    "username",
    "password",
    [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
);
 MySQL connection
$pdo_mysql = new PDO(
    "mysql:host=localhost; dbname=testdb; charset=utf8mb4",
    "username",
    "password",
    [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
);

get the last insert ID

// PostgreSQL
$stmt = $pdo_pg->prepare("INSERT INTO users (name) VALUES (?)  RETURNING id");
$stmt->execute(['John']);
$id = $stmt->fetchColumn();    Use the RETURNING clause
// MySQL
$pdo_mysql->exec("INSERT INTO users (name) VALUES ('John')");
$id = $pdo_mysql->lastInsertId();

best practice suggestions

 1. Use an abstract layer

// Create a database adapter
class Database {
    private $pdo;
    
    public function __construct($type, $config) {
        if ($type === 'pgsql') {
            $dsn = "pgsql:host={$config['host']}; dbname={$config['dbname']}";
        } else {
            $dsn = "mysql:host={$config['host']}; dbname={$config['dbname']}; charset=utf8mb4";
        }
        $this->pdo = new PDO($dsn, $config['user'], $config['pass']);
    }
    
     Unified method interface
    public function insert($table, $data) {
         Handle database discrepancies
    }
}

2. Avoid database-specific syntax

 -- bad: Use database-specific functions
SELECT DATE_FORMAT(created_at, '%Y-%m-%d') FROM users;  -- MySQL
SELECT TO_CHAR(created_at, 'YYYY-MM-DD') FROM users;    -- PostgreSQL
-- Okay: Let PHP handle the format conversion
SELECT created_at FROM users;
 Format Dates in PHP

3. Use a query builder

Consider using Doctrine DBAL, Laravel's query builder, etc., which can automatically handle database differences.

summary

Featurespdo_pgsqlpdo_mysql
DSN format`pgsql:` `mysql:`
port default54323306
quote identifierdouble quotes '"'<<>td width="283" valign="top" style="word-break: break-all; text-align: justify;">backtick marks' 
insert IDsequence is requiredautomatically fetched
Boolean returns 't'/'f' 1/0
array typeSupportnot supported
 JSON typenatively supportMySQL 5.7+ supports

Core recommendation: While PDO provides a unified interface, writing portable code avoids database-specific SQL syntax. If your project needs to switch databases, you should use a database abstraction layer or ORM.

標籤: pdo database support PDO pgsql mysql

AmupuCopyright Amupu.Z-Blog.Some Rights Reserved.