博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpringMvc+Hibernate+Mysql保存表情字符(昵称)到数据库报错的问题?
阅读量:6833 次
发布时间:2019-06-26

本文共 2838 字,大约阅读时间需要 9 分钟。

背景:

  一个中小型H5游戏

 

描述

  游戏通过微信授权登入, 获取到用户昵称并将用户信息保存至Mysql数据库, 当遇到有些用户微信昵称中带有表情(特殊字符)时, 保存至数据库出错!

 

核心错误:

Caused by: java.sql.SQLException: Incorrect string value: '\xF0\x9F\xA4\xB4\xF0\x9F...' for column 'nick_name' at row 7	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055)	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3536)	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3468)	at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1957)	at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2107)	at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2648)	at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2086)	at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2371)	at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2289)	at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2274)	at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeUpdate(NewProxyPreparedStatement.java:105)	at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2595)	... 77 more

  

问题剖析:

  查阅线上资料后了解到, "特殊表情字符为4个字节,而 utf8 字符集只支持1-3个字节的字符, 将数据库相关字符集改为utf8mb4即可解决问题, 前提是Mysql版本需要5.5以上, 否则不支持该字符集"

 

修复实践:

  第一步: 修改 用户表 > 昵称字段 字符集改为 utf8mb4... 经测试仍无法保存, 报相同错误

  第二步: 在以上基础上 修改 用户表 字符集为 utf8mb4...经测试仍旧无法保存, 报相同错误

  第三步: 在以上基础上 修改 数据库 字符集为 utf8mb4...经测试仍旧无法保存, 报相同错误

  第四步: 在以上基础上 修改Mysql配置文件 my.ini , 修改内容包括: 1. default-character-set=utf8mb4  2. character-set-server=utf8mb4  总之把utf8都改成了 utf8mb4, 重启Mysql服务...经测试该状态下使用Mybatis可以顺利将表情字符存入数据库, 但是使用Hibernate仍旧无法保存, 报相同错误

  第五步: 修改项目持久层代码BaseDaoImpl.java, 在插入和修改记录前加入一段代码...经测试, 成功将表情字符存入Mysql

 

相关代码:

    "getSession().connection().prepareStatement("set names utf8mb4").execute();"

  

public T save(T entity) {        Assert.notNull(entity);        try {            getSession().connection().prepareStatement("set names utf8mb4").execute();        } catch (Exception e) {            e.printStackTrace();        }        getSession().save(entity);        return entity;    }    public Object update(Object entity) {        Assert.notNull(entity);        try {            getSession().connection().prepareStatement("set names utf8mb4").execute();        } catch (Exception e) {            e.printStackTrace();        }        getSession().update(entity);        //getSession().flush();        return entity;    }    public Object saveOrUpdate(Object entity) {        Assert.notNull(entity);        try {            getSession().connection().prepareStatement("set names utf8mb4").execute();        } catch (Exception e) {            e.printStackTrace();        }        getSession().saveOrUpdate(entity);        return entity;    }

    

  

转载于:https://www.cnblogs.com/imyjy/p/7803108.html

你可能感兴趣的文章
判断系统是不是 XP
查看>>
RDF和RDFS是什么
查看>>
X61 U盘安装系统
查看>>
C代码
查看>>
php URLEncode() / php URLEncode函数 php urldecode...
查看>>
knn 分类
查看>>
weblogic Java反序列化漏洞测试和解决
查看>>
svn高可用集群搭建
查看>>
设计模式6大原则:里氏置换原则
查看>>
实现HTTPS系列第五弹(终章)之【通过OpenSSL实现HTTPS】
查看>>
Linux防火墙
查看>>
如何通过一个值查找到值所在的SQL数据库表
查看>>
Python学习—面向对象学习上
查看>>
3.9 对称三位素数
查看>>
Oracle临时表空间使用分析
查看>>
傻瓜式的ARP处理方法
查看>>
Django1.4 python2.7 apache mod_python 安装与部署实例
查看>>
浅析MySql二进制日志的应用
查看>>
tcc新的插装引擎对比原有实现的改进
查看>>
layoutSubviews何时调用的问题
查看>>