MYSQL支持utf8mb4
MYSQL默认的utf8字符集采用了3个字节来进行保存.这就存在了一个问题,那就是有部分的UTF8的字符其实是保存不进MYSQL的,比如现在流行的emoji表情,这和以前的认知是不同的.为了避免以后出现问题,找了这方面的信息.推荐如果有保存扩展字符的用户,提前就把MYSQL的字符集给修改了.具体MYSQL的默认utf8支持哪些字符编码,可以参见这个:Unicode编码表,前126行就是它支持的,后面的就是不支持的.
发现这个问题其实相当的偶然,在知乎上看到了一个问题为什么知乎不支持non-BMP的汉字?.突然发现了这个问题,一验证果然如此.
具体来说就是MYSQL的utf8字符集只使用了3个字节来保存字符.因此UTF8扩展区的字符就无法保存.这个在MYSQL5.5后引入了utf8mb4
的字符集来解决这个问题,它使用了4个字节来存储字符,扩展了存储的数量.因此,如果各位是使用的MYSQL5.5以上的版本,推荐在可能存入扩展字符的字段上设置字符集为utf8mb4.虽然这样可能会造成空间的浪费,但是比以后在上线的系统上升级数据库的风险要小的多.
修改方法
MYSQL服务器端
只需要修改数据库的配置文件 /etc/my.cnf
,增加或修改以下两行:
|
|
然后重启数据库即可.
对于已有的表,执行:
|
|
即可.
客户端
由于JDBC的MYSQL驱动现在不支持显示的设置utf8mb4
字符集,所以不能在url连接上增加characterEncoding=utf8mb4
.
那么就只能采取以下的三种方法了(都需要高版本的JDBC驱动):
- 在服务器上设置了
character-set-server=utf8mb4
后,在客户端url上不显示的设置字符集,它会自动继承服务器的设置 - 在执行SQL之前,运行
set names utf8mb4
.例如:connection.prepareStatement("set names utf8mb4").executeQuery();
- 设置MYSQL的 init_connect参数,设置
set names utf8mb4
.