首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 字元集修改完整指南:從 latin1 遷移至 utf8mb4

     編輯:MySQL 綜合教學

問題背景

早期 MySQL 預設字元集為 latin1 (單字節西歐編碼),導致中文儲存亂碼、Emoji 無法儲存。現代應用需統一遷移至 utf8mb4。

檢查當前字元集


mysql> SHOW VARIABLES LIKE 'character%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | latin1                     |
| character_set_connection | latin1                     |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | latin1                     |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

修改配置檔永久生效

Linux (my.cnf)


vim /etc/my.cnf
# 或 /etc/mysql/my.cnf, /etc/mysql/mysql.conf.d/mysqld.cnf

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect = 'SET NAMES utf8mb4'

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

Windows (my.ini)


# 尋找 my.ini (通常在安裝目錄或 C:\ProgramData\MySQL\MySQL Server 5.7\my.ini)
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

重啟服務


# Linux
service mysqld restart
# 或 systemctl restart mysqld

# Windows (管理員 CMD)
net stop mysql
net start mysql
# 或 services.msc 圖形介面重啟

驗證修改結果


mysql> SHOW VARIABLES LIKE 'character%';
+--------------------------+--------------------+
| Variable_name            | Value              |
+--------------------------+--------------------+
| character_set_client     | utf8mb4            |
| character_set_connection | utf8mb4            |
| character_set_database   | utf8mb4            |
| character_set_filesystem | binary             |
| character_set_results    | utf8mb4            |
| character_set_server     | utf8mb4            |
| character_set_system     | utf8               |
| character_sets_dir       | ...                |
+--------------------------+--------------------+

會話級臨時修改 (不重啟)


SET NAMES utf8mb4;
-- 等同於
SET character_set_client = utf8mb4;
SET character_set_connection = utf8mb4;
SET character_set_results = utf8mb4;

僅當前連線有效,斷開失效。

現有資料庫/表/欄位轉換 (關鍵步驟)

修改配置檔只影響新建物件,現有資料必須顯式轉換:

1. 轉換資料庫預設字元集


ALTER DATABASE db_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

2. 轉換表字元集 (含所有文字欄位)


ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

3. 僅修改單一欄位字元集


ALTER TABLE table_name MODIFY col_name VARCHAR(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

遷移檢查清單

  1. 備份資料庫 (mysqldump / XtraBackup)。
  2. 修改配置檔並重啟。
  3. 執行資料庫/表級 CONVERT TO。
  4. 檢查應用層連線字串均指定 charset=utf8mb4。
  5. 全量測試:中文、Emoji、特殊符號、排序、LIKE 查詢、索引長度 (utf8mb4 佔 4 bytes,複合索引可能超 767/3072 限制,需 innodb_large_prefix=ON / innodb_file_format=Barracuda / ROW_FORMAT=DYNAMIC)。

常見坑

  • utf8 vs utf8mb4: MySQL utf8 實為 utf8mb3,僅支援 BMP (基本多文種平面),無法儲存 Emoji (U+1F600 等)。
  • 索引長度限制: utf8mb4 單字元 4 bytes,VARCHAR(255) 索引長度 1020 bytes > 767 (舊版限制) 或 3072 (新版)。解決:縮短欄位長度、使用前綴索引、啟用 innodb_large_prefix + DYNAMIC/COMPRESSED 行格式。
  • 排序規則選擇: utf8mb4_general_ci 速度快但準確度低 (如 ß = ss);utf8mb4_unicode_ci (或 0900_ai_ci) 準確遵循 Unicode 標準,推薦生產使用。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved