MySQL 5.1.5-alpha,建表測試 VARCHAR(200) 欄位實際可存字元數。
| 字元集 | 位元組/字元 | 1 漢字佔用字元數 | VARCHAR(200) 可存漢字數 | VARCHAR(200) 可存字母數 | 適用場景 |
|---|---|---|---|---|---|
| latin1 | 1 byte | 2 字元 (雙位元組) | 100 | 200 | 純西歐語系、舊系統相容 |
| utf8 (MySQL 俗稱 utf8mb3) | 3 bytes | 1 字元 | 200 | 200 | 通用多語言、Emoji 不支援 |
| utf8mb4 (5.5.3+ 推薦) | 1-4 bytes | 1 字元 | 200 | 200 | 完整 Unicode、支援 Emoji/生僻字 |
| gbk | 2 bytes | 1 字元 | 200 | 200 | 簡繁中文環境、舊專案相容 |
VARCHAR(N) 的 N 代表**字元數**而非位元組數(MySQL 4.1+)。utf8 實際為 utf8mb3,最大 3 bytes/字,**無法存 Emoji (4 bytes)**,會報 Incorrect string value。COLLATE utf8mb4_unicode_ci (準確排序) 或 utf8mb4_general_ci (效能略佳)。latin1 常被用作「二進位桶」儲存任意位元組流(不做字元檢查),但不建議新專案使用。
Server (my.cnf)
→ Database (CREATE DATABASE ... DEFAULT CHARSET=)
→ Table (CREATE TABLE ... DEFAULT CHARSET=)
→ Column (定義時 CHARSET=)
→ Connection (SET NAMES / JDBC URL characterEncoding)
越內層優先級越高,建議**統一全鏈路 utf8mb4**,避免隱性轉碼。
