MySQL 5.0.16 時代常見亂碼:中文存入變問號、讀出亂碼、排序錯誤。根因:伺服器、資料庫、表、欄位、連線五層字元集不一致。
CREATE DATABASE mydb DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci;
CREATE TABLE mytable (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100)
) ENGINE=MyISAM DEFAULT CHARSET=gbk;
-- 或 InnoDB
CREATE TABLE mytable (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100)
) ENGINE=InnoDB DEFAULT CHARSET=gbk AUTO_INCREMENT=40;
VARCHAR/CHAR/TEXT 欄位:校對屬性統一為 gbk_chinese_ci
# PHP
$db->query("SET CHARACTER SET GBK");
# 或
$db->query("SET NAMES GBK");
# 相當於設定 Connection Character Sets and Collations
⚠️ Windows 環境下 PHP 通常不需此步 (預設字元集相容)。
[client]
default-character-set = utf8mb4
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
innodb_large_prefix = ON
innodb_file_format = Barracuda
innodb_file_per_table = ON
CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE TABLE mytable (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
# JDBC
jdbc:mysql://host:3306/mydb?useUnicode=true&characterEncoding=utf8mb4
# PHP PDO
$pdo = new PDO("mysql:host=localhost;dbname=mydb;charset=utf8mb4", $u, $p);
# PHP mysqli
$mysqli->set_charset('utf8mb4');
STATUS;
# 必須全為 utf8mb4 (或 gbk 歷史專案)
SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';
mysqldump --default-character-set=gbk --all-databases > backup.sqlcharacterEncodingutf8 (實為 utf8mb3) 而非 utf8mb4innodb_large_prefix