**統一使用 utf8mb4**(MySQL 5.5.3+),支援完整 Unicode(含 Emoji),避免 utf8 僅支援 BMP 平面的缺陷。
-- 1. 建立資料庫指定預設字元集
CREATE DATABASE IF NOT EXISTS my_db
DEFAULT CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
-- 2. 建表指定字元集
CREATE TABLE my_table (
name VARCHAR(20) NOT NULL DEFAULT ''
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
<?php
$link = mysqli_connect('localhost', 'user', 'pass', 'my_db');
mysqli_set_charset($link, 'utf8mb4'); // 關鍵:設定連線字元集
$name = '測試';
$name_utf8 = mb_convert_encoding($name, 'UTF-8', 'GB2312'); // 轉碼
mysqli_query($link, "INSERT INTO my_table (name) VALUES ('$name_utf8')");
?>
<?php
header('Content-Type: text/html; charset=utf-8');
$link = mysqli_connect('localhost', 'user', 'pass', 'my_db');
mysqli_set_charset($link, 'utf8mb4');
if (isset($_POST['name'])) {
mysqli_query($link, "INSERT INTO my_table (name) VALUES ('".$link->real_escape_string($_POST['name'])."')");
}
?>
<meta charset="utf-8">
<form method="post"><input name="name"><input type="submit"></form>
MySQL Client 預設 latin1,執行 SET NAMES utf8mb4; 即可正常顯示中文。
# 1. 匯出(指定舊字元集 latin1,避免雙重轉碼)
mysqldump --default-character-set=latin1 -h localhost -u root -p my_db --tables old_table > old.sql
# 2. 轉碼(假設原始資料實為 GB2312)
iconv -f GB2312 -t UTF-8 -c old.sql > new.sql
# 3. 匯入(檔案開頭加入 SET NAMES utf8mb4;)
sed -i '1i SET NAMES utf8mb4;' new.sql
mysql -h localhost -u root -p my_db < new.sql
CREATE TABLE t (c VARCHAR(20) BINARY) CHARSET=latin1;
BINARY 逐位元比較繞過排序問題