CREATE DATABASE `test` CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';
CREATE TABLE `user` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`name` VARCHAR(50) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
SHOW VARIABLES LIKE '%char%'; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | utf8 | | character_set_system | utf8 | +--------------------------+----------------------------+
關鍵三項:client、connection、results 必須一致。
SET NAMES utf8; -- 等價於 SET character_set_client = utf8; SET character_set_connection = utf8; SET character_set_results = utf8;
my.cnf[mysqld] character-set-server = utf8 collation-server = utf8_general_ci init_connect = 'SET NAMES utf8' [client] default-character-set = utf8 [mysql] default-character-set = utf8
| 文件編碼 | 連接字符集 | 操作步驟 |
|---|---|---|
| UTF-8 (無 BOM) | SET NAMES utf8 | ✅ 直接導入 |
| GBK/ANSI | SET NAMES gbk | ✅ 直接導入 |
| UTF-8 | SET NAMES gbk | ❌ 亂碼 - 編碼不匹配 |
| GBK | SET NAMES utf8 | ❌ 亂碼 - 編碼不匹配 |
/*!40101 SET NAMES utf8 */;mysql -u user -p --default-character-set=utf8 db_name < backup.sql
<meta charset="UTF-8"> (HTML5) 或 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">Content-Type: text/html; charset=utf-8// JDBC URL
jdbc:mysql://host:3306/db?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull
// PHP PDO
$pdo = new PDO("mysql:host=localhost;dbname=test;charset=utf8", $user, $pass);
| 維度 | UTF-8 | GBK |
|---|---|---|
| 字符覆蓋 | 全球所有字符 (含 Emoji 需 utf8mb4) | 中日韓常用字,無 Emoji |
| 存儲空間 | 中文 3 字節/字 | 中文 2 字節/字 (節省 33%) |
| 兼容性 | 現代標準,推薦新項目 | 舊系統、純中文環境 |
| DOS 顯示 | cmd 預設代碼頁 936 顯示亂碼 (實際存儲正確) | cmd 顯示正常 |
建議:新項目統一 utf8mb4,舊項目 GBK 可維持但遷移規劃中納入。