最近在做小程序,存储微信昵称的时候,遇到了这个问题
insert into user (id, parentId, phone, token, nickname, avatarUrl,type, createtTime, updateTime) values (?, ?, ?, ?, ?, ?, ?, ?, ?)
### Cause: java.sql.SQLException: Incorrect string value: '\xF0\x9F\xA4\x94' for column 'nickname' at row 1
; uncategorized SQLException for SQL []; SQL state [HY000]; error code [1366]; Incorrect string value: '\xF0\x9F\xA4\x94' for column 'nickname' at row 1; nested exception is java.sql.SQLException: Incorrect string value: '\xF0\x9F\xA4\x94' for column 'nickname' at row 1] with root cause
java.sql.SQLException: Incorrect string value: '\xF0\x9F\xA4\x94' for column 'nickname' at row 1
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:965)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3976)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3912)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2530)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2683)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2486)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1858)
这是由于该昵称是emoj表情引起的,emoji表情的编码是utf8mb4, mysql的默认编码是utf8,那么如何让mysql支持emoji表情呢?
第一步、修改mysql配置文件
(linux和mac下my.cnf windows 下my.ini mac下mysql安装路径/usr/local/mysql)
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
第二步、修改已有数据库、表、字段的编码
如果是新建数据库,则可忽略此步骤
这一步可以在mysql中使用mysqlclient操作,也可使用navicat等工具操作
ALTER DATABASE "你自己的数据库" CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
ALTER TABLE " 你自己的数据库表" CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
alter table "你自己的数据库表" modify `NICKNAME` varchar(80) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci COMMENT '昵称';
此处我只修改了user表,和nickname字段,其他表和字段未修改 (考虑到只有昵称会存在emoji)
第三步、重启mysql
./mysql.server restart
检查是否修改好
SHOW VARIABLES WHERE Variable_name LIKE 'character_set_%' OR Variable_name LIKE 'collation%'
character_set_client utf8
character_set_connection utf8
character_set_database utf8mb4
character_set_filesystem binary
character_set_results utf8
character_set_server utf8mb4
character_set_system utf8
character_sets_dir /xindao/mysql/share/charsets/
collation_connection utf8_general_ci
collation_database utf8mb4_unicode_ci
collation_server utf8mb4_unicode_ci
character_set_client utf8 (此处没有显示utf8mb4,不知道原因,但可以存储emoji了)