早期 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/ |
+--------------------------+----------------------------+
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
# 尋找 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;
僅當前連線有效,斷開失效。
修改配置檔只影響新建物件,現有資料必須顯式轉換:
ALTER DATABASE db_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE table_name MODIFY col_name VARCHAR(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CONVERT TO。charset=utf8mb4。innodb_large_prefix=ON / innodb_file_format=Barracuda / ROW_FORMAT=DYNAMIC)。utf8 實為 utf8mb3,僅支援 BMP (基本多文種平面),無法儲存 Emoji (U+1F600 等)。VARCHAR(255) 索引長度 1020 bytes > 767 (舊版限制) 或 3072 (新版)。解決:縮短欄位長度、使用前綴索引、啟用 innodb_large_prefix + DYNAMIC/COMPRESSED 行格式。utf8mb4_general_ci 速度快但準確度低 (如 ß = ss);utf8mb4_unicode_ci (或 0900_ai_ci) 準確遵循 Unicode 標準,推薦生產使用。