项目中需要存储用户的微信昵称,发现向数据库存储过程中报错。
看了一下报错的昵称,都有表情之类的特殊字符。百度了一下,常用的utf8编码格式只支持最多3个字节的字符,特殊字符、emoji表情字节是4个字符,所以会存储失败。
方法一:修改数据库编码类型
mysql5.5.3之后的版本提供了utf8mb4编码,如果需要在数据库中存储特殊字符,可以将数据库、数据表、字段修改成此类编码。在UI界面直接修改,或执行sql语句修改均可。设置编码格式为utf8mb4,字符集是utf8mb4_unicode_ci。
另外,代码中连接数据库的配置指定characterEncoding=UTF-8即可,mysql会自动映射到utf8m64上,不需要额外声明。
方法二:将特殊字符编码后再存入数据库
使用base64或其他编码方式均可,存入前编码,取出后解码,实现传递。
示例代码如下:
// 编码
String nickname = "带特殊字符的昵称";
String nicknameEncode = Base64.getEncoder().encodeToString(nickname.getBytes("utf-8"));
// 解码
byte[] nicknameDecodeBytes = Base64.getDecoder().decode(nicknameEncode.getBytes("utf-8"));
String nicknameDecode = new String(nicknameDecodeBytes);