一、基本原则
如果要实现存储 emoji 表情到 MySQL 实例,需要应用客户端、到 MySQL 实例的连接、MySQL 实例内部 3 个方面统一使用或者支持 utf8mb4 字符集。
否则会报Incorrect string value: ‘\xF0\x9F\x98\xAD",…’ for column ‘commentContent’ at row 1错误
解决方法
1. 修改mysql数据库的编码为uft8mb4
1.1. 低版本Mysql<5.5.3
没啥好办法,把字段类型改为 MEDIUMBLOB , 其他啥都不用改(继续保持数据库字符集和连接字符集都是utf8),问题解决。
mysql> show variables like ‘char%’;
+————————–+—————————-+
| Variable_name | Value |
+————————–+—————————-+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+————————–+—————————-+ 这个状态下 MEDIUMBLOB 就能搞定。
1.2. MySQl>=5.5.3可以不用像上面那么做
1.2.1. 修改mysql配置文件,设置默认字符集utf8mb4, 包括collation
[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’
1.2.2. 重启,确认上述配置生效
mysql> SHOW VARIABLES WHERE Variable_name LIKE ‘character_set_%’ OR Variable_name LIKE ‘collation%’;
+————————————-+——————————+
| Variable_name | Value |
+————————————-+——————————+
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | utf8mb4 |
| character_set_server | utf8mb4 |
| character_set_system | utf8 |
| collation_connection | utf8mb4_unicode_ci |
| collation_database | utf8mb4_unicode_ci |
| collation_server | utf8mb4_unicode_ci |
+————————————-+——————————-+
2. 修改数据表的编码为utf8mb4
执行命令:
ALTER TABLE TABLE_NAME CONVERT TO CHARACTER SET utf8mb4;
3. 在服务器和数据库连接的地方怎么办?
jdbc.url=jdbc:mysql://localhost:3306/aaa?useUnicode=true&characterEncoding=utf-8
这里这个utf-8要改成utf8mb4吗?
貌似不能改啊,数据库驱动就这些编码,没法改啊,一改就出错,不过没事,这是可以兼容的,对于jdbc的驱动来说.
既然无法修改,那就测试存储吧。
那么接下来会出现两种情况:
- 你可以存储表情了。
- 由于未知原因,你还是不能存储表情。
对于第二种情况的同学,我要告诉你的是,当你去操作这些需要加入表情的字段之前,请插入这条sql语句。
SET NAMES utf8mb4
即可。
也就是说每次插入啊修改啊之前都set一次就没有问题了。
以上方法,是想要实现存储表情的情况下的方法,当然,有更省事的方法,就是不存储表情,我们在存的时候过滤掉表情即可,就不用担心以后各种取各种兼容各种显示了。
<!-- https://mvnrepository.com/artifact/com.vdurmont/emoji-java -->
<dependency>
<groupId>com.vdurmont</groupId>
<artifactId>emoji-java</artifactId>
<version>4.0.0</version>!
这个包里,有这个方法,此方法可以自动移除输入的表情
String string = EmojiParser.removeAllEmojis(param);
本文来源: