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

MySQL 字符集完整實戰:從建庫到編碼遷移的最佳實踐

     編輯:MySQL 資料庫相關知識

MySQL 字符集配置與中文數據處理全攻略

字符集問題是 MySQL 中文應用最常見的坑。本文通過完整示例,涵蓋建庫建表、PHP 讀寫、舊數據遷移、客戶端選擇等全流程,助你徹底搞定編碼亂碼。

一、UTF-8 全鏈路配置示例

1. 建庫建表指定字符集

CREATE DATABASE IF NOT EXISTS my_db 
  DEFAULT CHARSET utf8 COLLATE utf8_general_ci;

CREATE TABLE my_table (
  name VARCHAR(20) NOT NULL DEFAULT ''
) ENGINE=MyISAM DEFAULT CHARSET utf8;

COLLATE utf8_general_ci 指定排序校驗規則,庫級字符集會作為表的默認值。

2. PHP 寫入數據(關鍵:set names utf8)

mysql_connect('localhost','user','pass');
mysql_select_db('my_db');
mysql_query("SET NAMES utf8"); // 必須!設置連接層傳輸編碼

$name = mb_convert_encoding("測試", "utf-8", "gb2312"); // 本地編碼轉 UTF-8
mysql_query("INSERT INTO my_table VALUES('$name')");

3. PHP 讀取並輸出

header("Content-Type: text/html; charset=utf-8");
mysql_connect('localhost','user','pass');
mysql_select_db('my_db');
mysql_query("SET NAMES utf8");

$q = mysql_query("SELECT * FROM my_table");
while($r = mysql_fetch_row($q)) { print_r($r); }

二、GB2312/GBK 環境的替代方案

若堅持使用 GB2312,建議表字符集設為 latin1(二進制存儲),配合 BINARY 屬性解決排序問題:

CREATE TABLE my_table (
  name VARCHAR(20) BINARY NOT NULL DEFAULT ''
) ENGINE=MyISAM DEFAULT CHARSET latin1;

此法可在命令行直接操作中文,避免 gb2312/gbk 字符集在某些版本的兼容性問題。

三、舊數據從 latin1 遷移到 UTF-8 實戰步驟

  1. 導出:mysqldump --default-character-set=latin1 -h localhost -u root -B my_db --tables old_table > old.sql
  2. 轉碼:iconv -t utf-8 -f gb2312 -c old.sql > new.sql(或省略 -f 自動檢測)
  3. 注入 SET NAMES:在 new.sql 所有 INSERT/UPDATE 前插入 SET NAMES utf8;
  4. 導入:mysql -h localhost -u root my_db < new.sql

完成後驗證數據完整性,大功告成!

四、支援 UTF-8 的常用 MySQL 客戶端

  • Navicat:商業軟體,漢化完善,體驗佳。
  • phpMyAdmin:開源 Web 介面,無需安裝,推薦。
  • Linux Terminal:設置終端編碼為 UTF-8,連接後執行 SET NAMES UTF8; 即可。
  • MySQL-Front:項目已停止,不建議使用破解版。

核心原則總結

  1. 庫、表、連接、應用輸出**四層字符集必須一致**。
  2. SET NAMES charset 是連接層編碼宣告,不可省略。
  3. 遷移時用 mysqldump --default-character-set 正確聲明源編碼,再用 iconv 轉碼。
  4. 選擇支援目標字符集的客戶端工具,避免工具層面轉碼導致二次亂碼。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved