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

MySQL 中文建表亂碼徹底解決:utf8mb4 全鏈路配置實戰

     編輯:MySQL 綜合教學

MySQL 中文建表亂碼的核心原因是「建表字元集 latin1」與「插入資料 utf8」不匹配,導致 Data too long for column 或亂碼。本文實戰演示「建庫→設定連線字元集→建表指定 utf8mb4」全鏈路配置,徹底解決中文存儲與導入導出問題。

問題複現:Data too long for column

mysql> CREATE TABLE person (id INT PRIMARY KEY, name VARCHAR(16)) ENGINE=InnoDB;
mysql> SET NAMES utf8;
mysql> INSERT INTO person VALUES (1, '張三');  -- 中文 2 字元,latin1 視為 6 位元組,超過 VARCHAR(16) 位元組限制
ERROR 1406 (22001): Data too long for column 'name' at row 1
根因:VARCHAR(16) 在 latin1 下限制 16 位元組,UTF-8 中文佔 3 位元組,實際只能存 5 個中文字。

標準解決流程:三步走

1. 建庫指定字元集

CREATE DATABASE test DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

2. 連線設定字元集(每個 Session 必須)

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

3. 建表顯式指定 utf8mb4

CREATE TABLE person (
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(16) DEFAULT 'nobody',
    birthday CHAR(19)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

驗證插入與查詢

mysql> SET NAMES utf8mb4;
mysql> INSERT INTO person (name, birthday) VALUES ('張三豐', '2023-01-01 12:00:00');
Query OK, 1 row affected (0.01 sec)

mysql> SELECT * FROM person;
+----+-----------+---------------------+
| id | name      | birthday            |
+----+-----------+---------------------+
| 1  | 張三豐    | 2023-01-01 12:00:00 |
+----+-----------+---------------------+

全鏈路字元集檢查清單

層級配置項推薦值驗證指令
伺服器character-set-serverutf8mb4SHOW VARIABLES LIKE 'character_set_server';
資料庫DEFAULT CHARACTER SETutf8mb4SHOW CREATE DATABASE db;
表DEFAULT CHARSETutf8mb4SHOW CREATE TABLE tbl;
欄位CHARACTER SETutf8mb4(可繼承表)SHOW FULL COLUMNS FROM tbl;
連線SET NAMES / connectionInitSqlutf8mb4SHOW VARIABLES LIKE 'character_set_%';
應用JDBC/ODBC/ORM 連線參數characterEncoding=utf8mb4檢查連線 URL/配置檔

避坑指南

  1. utf8 ≠ utf8mb4:MySQL utf8 實為 utf8mb3(最多 3 位元組),不支援 Emoji/生僻字,**必須用 utf8mb4**。
  2. 連線池初始化 SQL:HikariCP/Druid 設定 connectionInitSql=SET NAMES utf8mb4,確保每條連線自動設定。
  3. mysqldump 導出導入:mysqldump --default-character-set=utf8mb4 ... | mysql --default-character-set=utf8mb4 避免導入亂碼。
  4. 舊表轉換:ALTER TABLE tbl CONVERT TO CHARACTER SET utf8mb4(轉換資料),而非 ALTER TABLE tbl CHARACTER SET utf8mb4(僅影響新資料)。

延伸閱讀

  • MySQL 複製表結構與資料四大模式
  • MySQL 多表刪除語法完全指南
  • MySQL 獨立表空間優缺點深度分析
  • MySQL MyISAM 表結構恢復
  • MySQL 查詢表欄位個數的兩種方法
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved