使用mysql数据库的时候,如果字符集是UTF-8并且在java服务器上,当存储emoji表情的时候,会抛出以下异常(微信开发获取用户昵称,有的用户的昵称用的是emoji的图像)

java.sql.SQLException: Incorrect string value: '\xF0\x9F\x92\x94' for colum n 'nickName' at row 1

at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073)

at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3593)

at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3525)

at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1986)

at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2140)

at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2620)

at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1662)

at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1581)

原因: 这是由于字符集不支持的异常,因为utf-8编码有可能是两个,三个,四个字节,其中Emoji表情是四个字节,而mysql的utf-8编码最多三个字节,所以导致数据插不进去。

解决方法:

mysql保存emoji表情-微信用户昵称(完整保存与非完整保存)

一、完整保存

1.从数据库层面进行解决(mysql支持utf8mb4的版本是5.5.3+,必须升级到较新版本)

(1)修改database,table,column字符集

修改数据库编码

ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

修改表的编码

ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

修改表字段的编码

ALTER TABLE table_name CHANGE column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

(2)修改mysql配置文件mycnf(windows为my.ini)

[client]

default-character-set = utf8mb4

[mysql]

default-character-set = utf8mb4

[mysqld]

character-set-client-handshake = FALSE

character-set-server = utf8mb4

collation-server = utf8mb4_unicode_ci

init_connect='SET NAMES utf8mb4'

(3)mysql connection版本必须高于5.1.13

(4)db配置文件

jdbc.driverClassName=com.mysql.jdbc.Driver

jdbc.url=jdbc:mysql://localhost:3306/database?useUnicode=true&characterEncoding=utf8&autoReconnect=true&rewriteBatchedStatements=TRUE

jdbc.username=root

jdbc.password=123456

如果升级了mysql-connector,其中的characterEncoding=utf8可以自动被识别为utf8mb4(兼容原来的utf8),而

autoReconnection(当数据库连接异常中断时,是否自动重新连接?默认为false)强烈建议配上,忽略这个属性,可能导致缓存缘故 ,没有读取到DB最新的配置,导致一直无法试用utf8mb4字符集。

2.从应用层方面进行解决

在获取数据后对数据进行base64编码或url编码,当从数据库中取出准备显示的时候进行解码。

URLEncoder.encode(nickName, "utf-8");

URLDecoder.decode(nickname, "utf-8");

二、非完整保存(这里使用此方式)

非完整保存实际就是将字符串中特殊字符剔除,然后保存数据库

新增工具类EmojiFilter 工具类中方法如下

public class EmojiFilter {/*** 检测是否有emoji字符** @param source 需要判断的字符串* @return 一旦含有就抛出*/public static boolean containsEmoji(String source) {int len = source.length();for (int i = 0; i < len; i++) {char codePoint = source.charAt(i);if (!notisEmojiCharacter(codePoint)) {//判断确认有表情字符return true;}}return false;}/*** 非emoji表情字符判断** @param codePoint* @return*/private static boolean notisEmojiCharacter(char codePoint) {return (codePoint == 0x0)|| (codePoint == 0x9)|| (codePoint == 0xA)|| (codePoint == 0xD)|| ((codePoint >= 0x20) && (codePoint <= 0xD7FF))|| ((codePoint >= 0xE000) && (codePoint <= 0xFFFD))|| ((codePoint >= 0x10000) && (codePoint <= 0x10FFFF));}/*** 过滤emoji 或者 其他非文字类型的字符** @param source 需要过滤的字符串* @return*/public static String filterEmoji(String source) {if (!containsEmoji(source)) {return source;//如果不包含,直接返回}StringBuilder buf = null;//该buf保存非emoji的字符int len = source.length();for (int i = 0; i < len; i++) {char codePoint = source.charAt(i);if (notisEmojiCharacter(codePoint)) {if (buf == null) {buf = new StringBuilder(source.length());}buf.append(codePoint);}}if (buf == null) {return "";//如果没有找到非emoji的字符,则返回无内容的字符串} else if (buf.length() == len) {buf = null;return source;} else {return buf.toString();}}}

微信名称中包含表情符号插入数据库出错相关推荐

  1. mysql数据库名称中包含短横线的对应方式

    这篇文章记录一下mysql数据库名称中包含短横线时的对应方式,简单来说就是将名称使用``给包起来即可. 错误信息提示 创建数据库名称jeecg-boot,出现如下错误信息 mysql> crea ...

  2. 微信昵称中表情保存到数据库问题

    微信昵称中包含表情导致无法插入数据库 java.sql.SQLException: Incorrect string value: '\xF0\x9F\x8E\x80' for column 'wec ...

  3. POI:从Excel文件中读取数据,向Excel文件中写入数据,将Excel表格中的数据插入数据库,将数据库中的数据添加到Excel表

    POI 简介: POI是Apache软件基金会用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程序对Microsoft Office格式档案读和写的功能. ...

  4. java jtable 添加数据库_java-将jTable中的数据插入数据库

    我试图将一些JTable数据保存到数据库中:我的代码是这样的: public void save(){ String invSL = new Mixed_Calculation().invoice_S ...

  5. mybatis中useGeneratedKeys用法--插入数据库后获取主键值

    前言:今天无意在mapper文件中看到useGeneratedKeys这个词,好奇就查了下,发现能解决我之前插入有外键表数据时,这个外键获取繁琐的问题,于是学习敲DEMO记录    在项目中经常需要获 ...

  6. mybatis mysql usegeneratedkeys_mybatis中useGeneratedKeys用法--插入数据库后获取主键值

    前言:今天无意在mapper文件中看到useGeneratedKeys这个词,好奇就查了下,发现能解决我之前插入有外键表数据时,这个外键获取繁琐的问题,于是学习敲DEMO记录 在项目中经常需要获取到插 ...

  7. 若查找课程表中课程名称是计算机或英语,在课程表中要查找课程名称中包含计算机的课程,对应课程名称字段的正确条件表达式是______。...

    [判断题]搜索引擎的用户接口供用户输入查询要求并显示结果. [多选题]控制共聚物组成的方法有( )等. [单选题]分离外周血单个核细胞常用的分层液是 [单选题]产品结构就是以( ) 来实现产品各功能单 ...

  8. sql 插入text字段包含特殊字符_Kettle(PDI)转换中输出之插入/更新详解

    概述 Insert / update(插入 / 更新)此步骤首先使用一个或多个查询关键字查找表中的一行.如果找不到该行,则插入该行.如果可以找到它,并且要更新的字段相同,则不执行任何操作.如果它们不完 ...

  9. mysql 过滤微信昵称表情_PHP正则过滤处理微信昵称中emoji字符的方法

    本文实例讲述了PHP正则过滤处理微信昵称中emoji字符的方法.分享给大家供大家参考,具体如下: 今天刚做了一个微信应用,在获取微信昵称的过程中报错了,经查原因是微信昵称中包含emoji字符,在写入数 ...

  10. Java向数据库中插入数据出错时怎么避免插入错误数据

    Java向数据库中插入数据出错时怎么避免插入错误数据 对于初学者,向数据库写数据时,当程序输错,会有错误的数据写入了数据库,这是可以用捕获异常回滚的方法避免这种情况的发生 代码如下: /** 完成增删 ...

最新文章

  1. python-mysql超简单银行转账Model(我说了很简单的)
  2. 编程范式,程序员的编程世界观(转)
  3. 配置Struts2.0
  4. 行人跟踪python_使用Python为初学者构建AI汽车和行人跟踪
  5. 如何分割合并ISO文件
  6. mock介绍及moco框架搭建使用
  7. 常用的oracle学习网站
  8. 自学JAVA的十大网站你都知道那些
  9. HCP数据的下载,以及头动文件和CSF文件的所在位置
  10. cad单位_CAD标注样式如何转换公制和英制
  11. 无线传感器网络MAC协议(下)
  12. java 打包发布_一个java项目的打包与发布
  13. java.sql.SQLException: sql injection violation, syntax error: TODO QUES
  14. 科研狗的英语翻译小众软件
  15. H3C交换机静态路由与NQA联动
  16. 怎样恢复计算机管理员身份,win10系统设置一直以管理员身份运行的恢复办法
  17. python的底层是c_Python的内存管理和垃圾回收机制:基于C语言源码底层深入剖析...
  18. 沙龙干货 Vol.1|如何让游戏广告收益不再艰难?演讲 PPT 免费领取!
  19. 分布式高可用高并发物联网(车联网-JT808协议)平台架构方案
  20. windows计划任务定时任务

热门文章

  1. 初探802.11协议(0)——开篇(IEEE802.11历史与Wi-Fi速率计算)
  2. oc引导windows蓝屏_使用Opencore引导ubuntu以及Linux的步骤
  3. 网盘变成本地硬盘教程
  4. JavaSE就业班四----数据库Oracle和JDBC
  5. oracle排列组合,Oracle SQL排列组合之排列问题
  6. 笔记本计算机信号不强,增强笔记本WiFi无线信号的方法
  7. 《稻盛和夫给年轻人的忠告》阅读笔记
  8. 移动硬盘上安装Ubuntu18.04系统
  9. 腾讯云部署node mysql_【腾讯云】配置安装node
  10. 【调剂】长江大学张菲菲教授招收硕士生