首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PDO_MYSQL 預定義常數實用指南:連線自動執行 SQL 設定字元集

     編輯:PHP 綜合知識

PDO_MYSQL 提供 PDO::MYSQL_ATTR_INIT_COMMAND 常數,允許在建立連線時自動執行指定 SQL,最常見用途是設定連線字元集(SET NAMES utf8mb4),避免每次查詢前手動執行。

基本用法

<?php
$dsn = "mysql:host=localhost;dbname=my_db;charset=utf8mb4";
$options = [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES => false,
    // 關鍵:連線成功後自動執行
    PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8mb4' COLLATE 'utf8mb4_unicode_ci'"
];

$pdo = new PDO($dsn, 'user', 'password', $options);

常數說明

常數型別說明
PDO::MYSQL_ATTR_INIT_COMMANDinteger連線時自動執行的 SQL,重連時亦會重新執行
PDO::MYSQL_ATTR_COMPRESSinteger啟用壓縮協定(需客戶端/伺服器支援)
PDO::MYSQL_ATTR_DIRECT_QUERYinteger直接查詢模式(不使用預處理),僅供相容舊代碼
PDO::MYSQL_ATTR_FOUND_ROWSinteger回傳符合條件行數而非影響行數
PDO::MYSQL_ATTR_IGNORE_SPACEinteger允許函數名後有空格
PDO::MYSQL_ATTR_LOCAL_INFILEinteger啟用 LOAD DATA LOCAL INFILE
PDO::MYSQL_ATTR_MAX_BUFFER_SIZEinteger緩衝區最大大小
PDO::MYSQL_ATTR_READ_DEFAULT_FILEinteger從 my.cnf 讀取參數
PDO::MYSQL_ATTR_READ_DEFAULT_GROUPinteger讀取 my.cnf 指定群組
PDO::MYSQL_ATTR_SSL_CAintegerSSL CA 憑證路徑
PDO::MYSQL_ATTR_SSL_CERTintegerSSL 憑證路徑
PDO::MYSQL_ATTR_SSL_KEYintegerSSL 私鑰路徑

進階:DSN 內建 charset vs INIT_COMMAND

// 方式一:DSN 參數(PHP 5.3.6+,推薦)
$dsn = "mysql:host=localhost;dbname=test;charset=utf8mb4";
// 內部會自動執行 SET NAMES,但無法指定 COLLATE

// 方式二:INIT_COMMAND(完整控制)
$options[PDO::MYSQL_ATTR_INIT_COMMAND] = "SET NAMES 'utf8mb4' COLLATE 'utf8mb4_unicode_ci'";
// 可同時設定時區、SQL_MODE 等
$options[PDO::MYSQL_ATTR_INIT_COMMAND] = "SET NAMES 'utf8mb4'; SET time_zone = '+08:00'; SET SESSION sql_mode = 'STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION'";

注意事項

  • MYSQL_ATTR_INIT_COMMAND 僅在 mysqlnd 或 libmysqlclient 驅動支援。
  • 多條 SQL 以分號分隔,全部在同一連線初始化階段執行。
  • 若使用連線池(如 Swoole、RoadRunner),重用連線時不會重新執行 INIT_COMMAND,需自行管理。
  • DSN charset 參數與 INIT_COMMAND 同時使用時,以 INIT_COMMAND 為準(視驅動實作而定)。

最佳實踐範本

function createPdo(): PDO {
    $dsn = sprintf(
        'mysql:host=%s;port=%d;dbname=%s;charset=utf8mb4',
        env('DB_HOST'), env('DB_PORT'), env('DB_NAME')
    );
    $options = [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
        PDO::ATTR_EMULATE_PREPARES => false,
        PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8mb4' COLLATE 'utf8mb4_unicode_ci'; SET time_zone = '+08:00'",
    ];
    return new PDO($dsn, env('DB_USER'), env('DB_PASS'), $options);
}

總結

善用 PDO::MYSQL_ATTR_INIT_COMMAND 可集中管理連線層級設定(字元集、時區、SQL_MODE),減少重複代碼,確保所有連線行為一致。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved