數據庫字符集設置為 utf-8,但在 Windows 命令行下向表中插入漢字時,報錯:
ERROR 1406 (22001): Data too long for column 'name' at row 1
核心原因:Windows 控制台(CMD/PowerShell)默認使用 GBK(代碼頁 936)編碼,而 MySQL 服務端期望接收 utf-8 編碼的數據。當客戶端以 GBK 發送多字節漢字(每字 2 字節),服務端按 UTF-8 解析(每字 3 字節),導致字節長度計算錯誤,觸發「超過列定義長度」報錯。

mysql> SET NAMES gbk;
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO t(name) VALUES('測試');
Query OK, 1 row affected (0.01 sec)
my.ini(通常在安裝目錄或 C:\ProgramData\MySQL\MySQL Server 5.x\)/etc/my.cnf 或 /etc/mysql/my.cnf[mysql] 及 [client] 區塊:[client]
default-character-set=gbk
[mysql]
default-character-set=gbk
net stop mysql && net start mysqlsystemctl restart mysqld之後所有客戶端連接默認使用 GBK 編碼與服務端交互,避免編碼轉換錯誤。
utf8mb4,避免編碼轉換帶來的各類坑。connectionInitSqls: SET NAMES utf8mb4;Python (PyMySQL) 連接時指定 charset='utf8mb4';Go (go-sql-driver) DSN 追加 ?charset=utf8mb4。-- 查看當前連接字符集
SHOW VARIABLES LIKE 'character_set_%';
-- 查看表實際字符集
SHOW CREATE TABLE t\G
-- 測試插入
INSERT INTO t(name) VALUES('測試😀');
SELECT name, HEX(name), CHAR_LENGTH(name), LENGTH(name) FROM t;
若 HEX 顯示正確的 UTF-8 字節序列,且 CHAR_LENGTH(字符數)與預期一致,則編碼鏈路正常。