character_set_client, character_set_connection, character_set_results)。三層任一不一致 → 亂碼。
-- 建庫指定
CREATE DATABASE mydb DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 建表指定
CREATE TABLE t (c VARCHAR(100)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 修正既有表
ALTER TABLE t CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 注意:CONVERT TO 會轉換資料;僅修改定義用 ALTER TABLE t CHARACTER SET utf8mb4;
PHP (mysqli/PDO):
$mysqli = new mysqli('localhost', 'user', 'pass', 'db');
$mysqli->set_charset('utf8mb4');
$pdo = new PDO('mysql:host=localhost;dbname=db;charset=utf8mb4', 'user', 'pass');
$pdo->exec("SET NAMES utf8mb4");
PHP 老版 mysql_* (已棄用):
mysql_query("SET NAMES utf8mb4"); -- 等同 SET character_set_client/connection/results
JDBC:jdbc:mysql://host/db?characterEncoding=utf8mb4&useSSL=false
Python (PyMySQL/mysqlclient):charset='utf8mb4' 參數。
<meta charset="utf-8">
header('Content-Type: text/html; charset=utf-8');
PHP/HTML/JS/CSS 檔案本身儲存為 UTF-8 無 BOM 編碼。
-- phpMyAdmin 介面語言:Chinese Simplified (zh-utf-8)
-- MySQL 連線校對:gbk_chinese_ci (舊版常見)
-- 建表指定
ENGINE=MyISAM DEFAULT CHARSET=gbk;
ENGINE=InnoDB DEFAULT CHARSET=gbk AUTO_INCREMENT=40;
-- 欄位校對
VARCHAR(100) COLLATE gbk_chinese_ci
-- PHP 代碼補丁 (Linux 必須)
mysql_query("SET CHARACTER SET GBK");
-- Windows 通常不需此行
現代專案請直接用 utf8mb4 全鏈路,勿再使用 gbk/big5/latin1。
SHOW VARIABLES LIKE 'character_set_%';
SHOW VARIABLES LIKE 'collation_%';
-- 期望輸出:
-- character_set_client=utf8mb4
-- character_set_connection=utf8mb4
-- character_set_results=utf8mb4
-- character_set_database=utf8mb4
-- character_set_server=utf8mb4
-- collation_connection=utf8mb4_unicode_ci
-- collation_database=utf8mb4_unicode_ci
-- collation_server=utf8mb4_unicode_ci
SET NAMES utf8 vs utf8mb4:utf8 是 MySQL 專屬 3 字節子集,無法儲存 Emoji(需 4 字節),必須用 utf8mb4。ALTER TABLE t CHARSET=utf8mb4),新舊資料編碼混雜 → 亂碼。必須 CONVERT TO CHARACTER SET utf8mb4。SET NAMES utf8mb4,或連線字串參數指定。