mysql> INSERT INTO users(name) VALUES('張三');
mysql> SELECT * FROM users;
+----+--------+
| id | name |
+----+--------+
| 1 | ?? |
+----+--------+
MySQL 預設字元集 latin1 (單字節),無法儲存多字節中文字符。需統一設為 utf8mb4 (支援完整 Unicode,含 Emoji)。
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
在 [mysqld] 區段新增/修改:
[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
sudo systemctl restart mysql
mysql -u root -p -e "SHOW VARIABLES LIKE '%character%';"
# 或登入後執行
SHOW VARIABLES LIKE '%character%';
預期輸出關鍵項均為 utf8mb4。
CREATE DATABASE test_utf8mb4 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE test_utf8mb4;
CREATE TABLE t (id INT PRIMARY KEY, name VARCHAR(50));
INSERT INTO t VALUES (1, '中文測試😀');
SELECT * FROM t;
-- 正常顯示:中文測試😀
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;?characterEncoding=utf8mb4、Python charset='utf8mb4'、PHP PDO charset=utf8mb4。utf8 (MySQL 別名 utf8mb3) → 僅支援 BMP 平面,無法儲存 Emoji、部分生僻字。character-set-server 不改 client 區段 → 客戶端插入仍按 latin1 發送,入庫亂碼。SET NAMES utf8mb4 永久生效 → 僅當前 Session 有效,需寫入配置檔或連線初始化 SQL。