INSERT INTO a_table VALUES('北京');
-- ERROR 1366 (HY000): Incorrect string value: '\xB1\xB1\xBE\xA9' for column 'b' at row 1
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
修改 my.cnf 後 必須重啟 MySQL。
CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE TABLE t (c VARCHAR(100)) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE t CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 或單欄位
ALTER TABLE t MODIFY c VARCHAR(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
PHP (mysqli/PDO):
$mysqli->set_charset('utf8mb4');
// 或 PDO DSN
$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8mb4', $user, $pass);
命令列:
mysql --default-character-set=utf8mb4 -u root -p
iconv -f GBK -t UTF-8 old.sql > new.sqlSHOW VARIABLES LIKE 'character_set%'; 全部為 utf8mb4。SHOW CREATE TABLE t; 表/欄位 CHARSET=utf8mb4。SET NAMES utf8mb4; 再插入中文測試。| 誤區 | 正確觀念 |
|---|---|
| 只改資料庫字元集 | 表、欄位、連線都要一致 |
| 用 utf8 而非 utf8mb4 | utf8 僅支援 BMP,無法儲存 Emoji/生僻字,必須用 utf8mb4 |
| 以為 SET NAMES 就夠了 | 伺服器/表/欄位字元集不匹配仍會報錯 |
徹底統一字元集為 utf8mb4,即可永久解決中文插入亂碼與 Incorrect string value 錯誤。