首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 字元集亂碼徹底解決:UTF-8 最佳實踐與舊資料遷移指南

     編輯:MySQL 資料庫相關知識

核心建議

**統一使用 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 寫入讀取關鍵步驟

情境一:PHP 內部字串為 GB2312/Big5

<?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')");
?>

情境二:頁面與表單皆為 UTF-8

<?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; 即可正常顯示中文。

舊資料遷移至 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

替代方案:latin1 存中文(不推薦新專案)

CREATE TABLE t (c VARCHAR(20) BINARY) CHARSET=latin1;
  • 利用 BINARY 逐位元比較繞過排序問題
  • 缺點:無法正確排序、長度計算錯誤、跨系統遷移極易出錯
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved