描述:由于字符集不支持的异常,因为utf-8编码有可能是两个、三个、四个字节,
其中Emoji表情是四个字节,而MySQL的utf-8编码最多三个字节,所以导致数据插不进去。
utf8mb4的最低mysql版本支持版本为5.5.3+
方式1:修改数据库层面
查看数据库字符集:
SHOW VARIABLES WHERE Variable_name LIKE 'character_set_%' OR Variable_name LIKE 'collation%';
保证character_set_client/character_set_connection/character_set_database/character_set_results/character_set_server为utf8mb4。
步骤1:修改数据库的字符集编码(database, table, column)
-- 修改database字符集编码
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
-- 修改表的字符集编码
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 修改列的字符集编码
ALTER TABLE table_name CHANGE column_name VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
步骤2:修改MySQL的配置文件(my.ini/my.cnf),需重启MySQL(mysql restart)
[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'
步骤3:升级最新版的mysql-connector-java >5.1.13,否则仍然无法使用utf8mb4
其中的characterEncoding=utf8可以自动被识别为utf8mb4
jdbc:mysql://localhost:3306/database?useUnicode=true&characterEncoding=utf8&autoReconnect=true&rewriteBatchedStatements=TRUE
方式2:应用层转码和编码
URLEncoder.encode(emoji, "utf-8");
URLEncoder.decode(emoji, "utf-8");