上午,開發和我說某表有時插入報:Incorrect string value: '\xF0\x9F\x98\x9C \xE9...' for column 'Nickname' at row 1,我的第一反應是:難道是sql_mode的問題。后來經排查是:字符集的問題。因為用戶錄入了表情字符。utf8字符編碼不支持
Emoji表情存儲。UTF-8編碼有可能是兩個、三個、四個字節。Emoji表情是4個字節,而Mysql的utf8編碼最多3個字節,所以數據插不進去。
解決方案:將Mysql的編碼從utf8轉換成utf8mb4。
1.修改配置文件my.cnf character-set-server=utf8mb4 2、將已經建好的表轉換成utfbmb4 命令:ALTER TABLE `TABLE_NAME` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; (將TABLE_NAME替換成你的表名) 3、將需要使用emoji的字段設置類型為utf8mb4 ALTER TABLE WU_WeChatUser MODIFY COLUMN `Nickname` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci COMMENT '用戶的昵稱' ;
總結:后續又實際測試了一遍,1)set names utf8mb4(在命令行可以動態修改) 2)修改該字段為utf8mb4_general_ci 3)修改配置文件:character-set-sever(重啟永久生效)
注意:本次測試我只按以上步驟修改,並未修改表的字符集, 數據庫的字符編碼的優先級: 列>表>庫
查看 MySQL 數據列(column)的字符集。
mysql> show full columns from WU_WeChatUser; +-------------+--------------+--------------------+------+-----+-------------------+----------------+---------------------------------+-----------------------------------------------------------------------+ | Field | Type | Collation | Null | Key | Default | Extra | Privileges | Comment | +-------------+--------------+--------------------+------+-----+-------------------+----------------+---------------------------------+-----------------------------------------------------------------------+ | Id | int(10) | NULL | NO | PRI | NULL | auto_increment | select,insert,update,references | 主鍵Id | | Subscribe | tinyint(3) | NULL | YES | | 1 | | select,insert,update,references | 用戶是否訂閱該公眾號1:是 2:否 | | Openid | varchar(100) | utf8_general_ci | NO | MUL | NULL | | select,insert,update,references | 用戶openId | | Nickname | varchar(200) | utf8mb4_general_ci | YES | | NULL | | select,insert,update,references | 用戶的昵稱 | | Sex | int(5) | NULL | YES | | 0 | | select,insert,update,references | 用戶的性別,1男,2女,0未知 | | Language | varchar(50) | utf8_general_ci | YES | | NULL | | select,insert,update,references | 用戶的語言 | | Province | varchar(100) | utf8_general_ci | YES | | NULL | | select,insert,update,references | 省 | | City | varchar(100) | utf8_general_ci | YES | | NULL | | select,insert,update,references | 市 | | Country | varchar(100) | utf8_general_ci | YES | | NULL | | select,insert,update,references | 國家 | | SourceIndex | int(10) | NULL | NO | MUL | 0 | | select,insert,update,references | 渠道來源索引,0:未知來源,其余值取自WU_WeChat_SourceType | | OperateTime | varchar(100) | utf8_general_ci | YES | | NULL | | select,insert,update,references | 操作時間 | | CreateTime | timestamp | NULL | NO | | CURRENT_TIMESTAMP | | select,insert,update,references | 創建時間 | +-------------+--------------+--------------------+------+-----+-------------------+----------------+---------------------------------+-----------------------------------------------------------------------+ 12 rows in set (0.00 sec)