MySqlmoji表情引发的存储异常微信昵称

问题背景:
项目中,MySql会保存来自微信的用户名,大家都知道微信用户名允许包含表情(如火星文,moji表情等),
通常的我们的数据库字符集会被设置为UTF8,那么此时就会出现入库的问题
1
2
MySql常用字符集设置:

  

含有moji表情的昵称入库问题:

org.springframework.jdbc.UncategorizedSQLException:
PreparedStatementCallback; uncategorized SQLException for SQL

SQL state [HY000]; error code [1366]; Incorrect string value:
‘xF0x9Fx8Dx89Ch…’ for column ‘nick_name’ at row 1;
nested exception is java.sql.SQLException: Incorrect string value:
‘xF0x9Fx8Dx89Ch…’ for column ‘nick_name’ at row 1

问题分析:
从MySql抛出的异常来看,是由于数据库中存在一个叫做”nick_name”的String类型字段,
保存值为’xF0x9Fx8Dx89Ch…’时抛出异常UncategorizedSQLException

我们先不去了解这个什么异常,很明显,如果我们保存一个正常的String是没有问题的,
那为什么这个表情会被识别为’xF0x9Fx8Dx89Ch…’ ,这到底是个什么鬼

下面我们基于硬件层和字库码表来分析一下:

1)先来说一下,为什么正常的String没有问题

不要以为计算机这么”聪明”,其实他们只认识0和1,为什么他们认识”123″,因为有字库和码表
1
2)那我们又得论一论字库码表是怎么来的了,当然这里还牵扯到字号和字体的问题我们不做过多讨论

这是之前写的一篇基于硬件层面介绍字库码表的博文: 字库码表原理

当然日后还会贴在这里一篇图片显示的原理,关于16进制RGB565的色值绘图 MARK:TODO

3)moji表情是字符,不是图片

是的,moji表情是字符,不是图片,属于unicode,是一种规范
无论是数据库或是前端显示都可以通过升级实现正常显示

MARK:TODO

- 这里以后还会贴一篇前端显示moji表情的解决方法

1
2
3
4
5
4)通俗的说,问题发生在数据库字符集设置上

数据库根本不认识’xF0x9Fx8Dx89Ch…’,在字符集中没有匹配到,导致’xF0x9Fx8Dx89Ch…’直接入库,发生异常

应该显示成什么,所以我们要配置一个合适的字符集,使数据库识别(支持)这个字符

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理