PHP + MySQL 是經典的 LAMP/LEMP 棧核心組合。本文從歷史淵源、安裝配置、數據類型、SQL 兼容性、存儲過程缺失、參考完整性、安全體系七個維度系統梳理兩者的協作關係,並給出生產環境部署建議。
; php.ini
extension=pdo_mysql
extension=mysqli
; 老版本 extension=mysql (PHP 7.0+ 已移除)
編譯參數:--with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd,推薦使用 mysqlnd(原生驅動),性能更好、無需 libmysqlclient、支援 mysqli::get_connection_stats()。
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect = 'SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci'
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
PHP 連接 DSN:mysql:host=...;dbname=...;charset=utf8mb4。
| MySQL 類型 | PHP 類型 | 注意事項 |
|---|---|---|
| TINYINT/SMALLINT/INT/BIGINT | int | 大整數超出 64 位用字符串 |
| DECIMAL/NUMERIC | string | 避免浮點精度損失,PHP 端用 bcmath 運算 |
| FLOAT/DOUBLE | float | 僅用於科學計算,金額禁用 |
| DATE/TIME/DATETIME/TIMESTAMP | string / DateTime | 推薦存儲 UTC,應用層轉時區 |
| CHAR/VARCHAR/TEXT | string | UTF-8 多字節長度注意 |
| JSON (5.7+) | array/object | json_decode() 映射 |
| ENUM/SET | string | PHP 端維護合法值白名單 |
| BLOB/VARBINARY | string (binary) | PDO::PARAM_LOB |
FULL OUTER JOIN、CHECK CONSTRAINT (8.0.16+ 支援)、WITH RECURSIVE (8.0+ 支援)。INSERT ... ON DUPLICATE KEY UPDATE、REPLACE INTO、LIMIT offset, row_count、BACKTICK 識別符引用。.so,CREATE FUNCTION 掛載,極少用。| 缺失特性 | 影響 | PHP 層替代方案 |
|---|---|---|
| 存儲過程 | 業務邏輯無法下沉 | Service 層封裝、事務腳本模式 |
| 觸發器 | 审計/同步難自動化 | 事件溯源、領域事件分發器 |
| 外鍵約束 (MyISAM 無/InnoDB 有但常關閉) | 參考完整性靠應用保證 | Repository 模式封裝關聯檢查 |
| 視圖 | 複雜查詢復用受限 | Query Object / Criteria 模式 |
DROP、ALTER、GRANT。PDO::MYSQL_ATTR_SSL_CA/KEY/CERT。PDO::ATTR_PERSISTENT=true 或 Swoole/Workerman 長連接MasterSlaveConnectionlong_query_time=1,定期 pt-query-digest 分析xtrabackup 全量 + Binlog 增量,定期恢複驗證Prometheus + mysqld_exporter + php-fpm_exporterPHP + MySQL 之所以成為經典,在於兩者**同為開源、同期演進、社區資源豐富、學習曲線平緩**。現代架構下,通過 PDO/mysqlnd + utf8mb4 + 預處理 + 讀寫分離 + 連接池,可支撐百萬級日活應用。若業務需強事務、複雜報表、地理空間,可評估遷移至 PostgreSQL 或 TiDB,但 PHP 代碼層面僅需調整 DSN 與少量方言 SQL。