mysql 添加ios表情符号,如何解决emoji表情插入MySQL数据库问题

问题描述:

当存储含有emoji表情时,会抛出类似如下异常:

java.sql.SQLException: Incorrect string value: '\xF0\x9F\x92\x94' for column 'name' at row 1

这就是字符集不支持的异常。因为UTF-8编码有可能是两个、三个、四个字节,其中Emoji表情是4个字节,而Mysql的utf8编码最多3个字节,所以导致了数据插不进去

问题处理:

第一步,修改MySQL数据库编码集为utf8mb4;

my.cnf一般在etc/mysql/my.cnf位置。

找到后请在以下三部分里添加如下内容:

[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'

修改完数据库的编码设置需要对数据库进行重启一下

/etc/init.d/mysql restart

输入命令,进入mysql命令行(mysql -uroot -p),执行如下SQL

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 |

+--------------------------+--------------------+

注:这一步一定在数据库所在服务器上完成。

第二步,在数据库连接url中的路径字段设为

useUnicode=true&characterEncoding=UTF-8&autoReconnect=true;

本地的客户端上(如Navicat、MySQLWorkBench)可能会因为编码的问题无法显示。

在服务器的命令行下也可能会因为编码的问题无法显示,我们的目标是能正常存入,能正常取出。能正常显示。

注明:对于 JDBC 连接串设置了 characterEncoding 为 utf8 或者做了上述配置仍旧无法正常插入 emoji 数据的情况,建议在代码中指定连接的字符集为 utf8mb4

服务器:ubuntu0.16.04.1

数据库:MySQL-5.7.22-0ubuntu0.16.04.1

连接端:JDBC

外部驱动:C3P0

语言环境:JAVA

参考文档:

可参考网址:

需要进一步解决的问题

1、为什么在客户端不能正常显示emoji表情(Nactivcat 、MySQL workbench)

Unicode 只是规定了 Emoji 的码点和含义,并没有规定它的样式。举例来说,码点U+1F600表示一张微笑的脸,但是这张脸长什么样,则由各个系统自己实现。

因此,当我们输入这个 Emoji 的时候,并不能保证所有用户看到的都是同一张脸。如果用户的系统没有实现这个 Emoji 符号,用户就会看到一个没有内容的方框,因为系统无法渲染这个码点。

2、set names 的原理

728702fd6087?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

SET NAMES x

相当于

SET character_set_client = x;

SET character_set_results = x;

SET character_set_connection = x;

所以说:

set names utf8mb4指定了客户端和服务器之间传递字符的编码规则为utf8mb4。

MySQL中的字符序名称遵从命名惯例:以字符序对应的字符集名称开头;以_ci(表示大小写不敏感)、_cs(表示大小写敏感)或_bin(表示按编码值比较)结尾。例如:在字符序“utf8_general_ci”下,字符“a”和“A”是等价的;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值