字符集基礎知識
gb2312、gbk、utf8(實為 utf8mb3)、utf8mb4 均支援中文,gbk 涵蓋字符最多,utf8mb4 為現代標準(含 Emoji)。
- 資料庫、資料表、欄位、連線均有獨立字符集設定,需保持一致。
檢視當前設定
mysql> SHOW VARIABLES LIKE 'character_set_%';
+--------------------------+--------+
| Variable_name | Value |
+--------------------------+--------+
| character_set_client | gb2312 |
| character_set_connection | gb2312 |
| character_set_database | gb2312 |
| character_set_filesystem | binary |
| character_set_results | gb2312 |
| character_set_server | latin1 |
| character_set_system | utf8 |
+--------------------------+--------+
關鍵參數說明
| 參數 | 影響範圍 |
character_set_client | 客戶端發送 SQL 的編碼 |
character_set_connection | 伺服器接收後轉換的編碼 |
character_set_results | 伺服器回傳結果的編碼 |
character_set_database | 預設資料庫字符集 |
character_set_server | 伺服器預設字符集 |
最常見亂碼原因
character_set_connection 與 character_set_results 不支援中文編碼。解決方法:
SET NAMES gbk; -- 或 utf8 / utf8mb4
SET NAMES charset 等同於同時設定上述三個連線參數,最簡便有效。
PHP 端最佳實踐
<?php
$mysqli = new mysqli("localhost", "user", "pass", "dbname");
// 連線成功後立即設定
$mysqli->set_charset("utf8mb4"); // 推薦 utf8mb4
// PDO 寫法
$pdo = new PDO("mysql:host=localhost;dbname=dbname;charset=utf8mb4", "user", "pass");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
?>
資料庫/資料表建立建議
CREATE DATABASE mydb DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE TABLE articles (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,
content TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
) DEFAULT CHARSET=utf8mb4;
遷移舊資料庫
- 備份:
mysqldump --default-character-set=latin1 dbname > backup.sql(以 latin1 導出避免雙重編碼)。
- 修改 SQL 檔:將
CHARSET=latin1 替為 CHARSET=utf8mb4。
- 匯入:
mysql --default-character-set=utf8mb4 dbname < backup.sql。
- 上一篇文章: FastTemplate 模板引擎入門:安裝、核心理念與基本操作範例
- 下一篇文章: PHP 向 MySQL 發送資料完整流程:HTML 表單、GET/POST、資料庫寫入與驗證
Copyright ©
程式碼之家 All Rights Reserved