【DB系列】SpringBoot+Mysql 无法保存emoj表情

尤记得很久以前,想存emoj表情到mysql中,需要额外的将emoj表情转码之后保存,每次读取时,再解码还原成一下;每次这种sb的操作,真心感觉心塞,那么有没有办法直接存呢?

mysql本身可以通过选择编码集(如utfbmb4)来支持emoj表情,然而今天遇到了一个相当鬼畜的问题,表中可以直接写入emoj表情,但是通过spring boot代码塞入的emoj时,却抛出异常:

1
2
3
4
5
6
7
8
Caused by: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\x9D\xE6\xB1...' for column 'nick' at row 1
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1084) ~[mysql-connector-java-5.1.30.jar:na]
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4232) ~[mysql-connector-java-5.1.30.jar:na]
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4164) ~[mysql-connector-java-5.1.30.jar:na]
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2615) ~[mysql-connector-java-5.1.30.jar:na]
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2776) ~[mysql-connector-java-5.1.30.jar:na]
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2838) ~[mysql-connector-java-5.1.30.jar:na]
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2082) ~[mysql-connector-java-5.1.30.jar:na]

接下来演示一下正确的使用姿势,以及导致上面问题的错误case,避免大家重复采坑

查看更多

分享到

【WEB系列】Listener四种注册姿势

javaw web三要素Filter, Servlet前面分别进行了介绍,接下来我们看一下Listener的相关知识点,本篇博文主要内容为SpringBoot环境下,如何自定义Listener并注册到spring容器

查看更多

分享到

【WEB系列】Servlet 注册的四种姿势

前面介绍了java web三要素中filter的使用指南与常见的易错事项,接下来我们来看一下Servlet的使用姿势,本篇主要带来在SpringBoot环境下,注册自定义的Servelt的四种姿势

  • @WebServlet 注解
  • ServletRegistrationBean bean定义
  • ServletContext 动态添加
  • 普通的spring bean模式

查看更多

分享到

【WEB系列】开启GZIP数据压缩

本篇可以归纳在性能调优篇,虽然内容非常简单,但效果可能出乎预料的好;

分享一个真实案例,我们的服务部署在海外,国内访问时访问服务时,响应有点夸张;某些返回数据比较大的接口,耗时在600ms+上,然而我们的服务rt却是在20ms以下,绝大部分的开销都花在了网络传输上

针对这样的场景,除了买云服务商的网络通道之外,另外一个直观的想法就是减少数据包的大小,直接在nginx层配置gzip压缩是一个方案,本文主要介绍下,SpringBoot如何开启gzip压缩

查看更多

分享到

【DB系列】JPA之指定id保存

前几天有位小伙伴问了一个很有意思的问题,使用JPA保存数据时,即便我指定了主键id,但是新插入的数据主键却是mysql自增的id;那么是什么原因导致的呢?又可以如何解决呢?

本文将介绍一下如何使用JPA的AUTO保存策略来指定数据库主键id

查看更多

分享到

【基础系列】指定Bean初始化顺序的若干姿势

上一篇博文介绍了@Order注解的常见错误理解,它并不能指定bean的加载顺序,那么问题来了,如果我需要指定bean的加载顺序,那应该怎么办呢?

本文将介绍几种可行的方式来控制bean之间的加载顺序

  • 构造方法依赖
  • @DependOn 注解
  • BeanPostProcessor 扩展

查看更多

分享到

【配置系列】Bean加载顺序之错误使用姿势辟谣

在网上查询Bean的加载顺序时,看到了大量的文章中使用@Order注解的方式来控制bean的加载顺序,不知道写这些的博文的同学自己有没有实际的验证过,本文希望通过指出这些错误的使用姿势,让观文的小伙伴可以知道@Order的具体的应用场景

查看更多

分享到

【WEB系列】过滤器Filter使用指南扩展篇

前面一篇博文介绍了在SpringBoot中使用Filter的两种使用方式,这里介绍另外一种直接将Filter当做Spring的Bean来使用的方式,并且在这种使用方式下,Filter的优先级可以直接通过@Order注解来指定;最后将从源码的角度分析一下两种不同的使用方式下,为什么@Order注解一个生效,一个不生效

本篇博文强烈推荐与上一篇关联阅读,可以get到更多的知识点: 191016-SpringBoot系列教程web篇之过滤器Filter使用指南

查看更多

分享到

【WEB系列】过滤器Filter使用指南

web三大组件之一Filter,可以说是很多小伙伴学习java web时最早接触的知识点了,然而学得早不代表就用得多。基本上,如果不是让你从0到1写一个web应用(或者说即便从0到1写一个web应用),在你的日常业务开发中不太可能碰到需要手写Filter的场景

本文将简单介绍写什么是Filter,以及在SpringBoot中使用Filter的一般姿势与常见问题

查看更多

分享到

【WEB系列】自定义异常处理HandlerExceptionResolver

关于Web应用的全局异常处理,上一篇介绍了ControllerAdvice结合@ExceptionHandler的方式来实现web应用的全局异常管理;

本篇博文则带来另外一种并不常见的使用方式,通过实现自定义的HandlerExceptionResolver,来处理异常状态

上篇博文链接: SpringBoot系列教程web篇之全局异常处理

查看更多

分享到

【WEB系列】全局异常处理

当我们的后端应用出现异常时,通常会将异常状况包装之后再返回给调用方或者前端,在实际的项目中,不可能对每一个地方都做好异常处理,再优雅的代码也可能抛出异常,那么在Spring项目中,可以怎样优雅的处理这些异常呢?

本文将介绍一种全局异常处理方式,主要包括以下知识点

  • @ControllerAdvice Controller增强
  • @ExceptionHandler 异常捕获
  • @ResponseStatus 返回状态码
  • NoHandlerFoundException处理(404异常捕获)

查看更多

分享到

【WEB系列】404、500异常页面配置

接着前面几篇web处理请求的博文,本文将说明,当出现异常的场景下,如404请求url不存在,,403无权,500服务器异常时,我们可以如何处理

查看更多

分享到