微信名称中包含表情符号插入数据库出错
使用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();}}}
微信名称中包含表情符号插入数据库出错相关推荐
- mysql数据库名称中包含短横线的对应方式
这篇文章记录一下mysql数据库名称中包含短横线时的对应方式,简单来说就是将名称使用``给包起来即可. 错误信息提示 创建数据库名称jeecg-boot,出现如下错误信息 mysql> crea ...
- 微信昵称中表情保存到数据库问题
微信昵称中包含表情导致无法插入数据库 java.sql.SQLException: Incorrect string value: '\xF0\x9F\x8E\x80' for column 'wec ...
- POI:从Excel文件中读取数据,向Excel文件中写入数据,将Excel表格中的数据插入数据库,将数据库中的数据添加到Excel表
POI 简介: POI是Apache软件基金会用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程序对Microsoft Office格式档案读和写的功能. ...
- java jtable 添加数据库_java-将jTable中的数据插入数据库
我试图将一些JTable数据保存到数据库中:我的代码是这样的: public void save(){ String invSL = new Mixed_Calculation().invoice_S ...
- mybatis中useGeneratedKeys用法--插入数据库后获取主键值
前言:今天无意在mapper文件中看到useGeneratedKeys这个词,好奇就查了下,发现能解决我之前插入有外键表数据时,这个外键获取繁琐的问题,于是学习敲DEMO记录 在项目中经常需要获 ...
- mybatis mysql usegeneratedkeys_mybatis中useGeneratedKeys用法--插入数据库后获取主键值
前言:今天无意在mapper文件中看到useGeneratedKeys这个词,好奇就查了下,发现能解决我之前插入有外键表数据时,这个外键获取繁琐的问题,于是学习敲DEMO记录 在项目中经常需要获取到插 ...
- 若查找课程表中课程名称是计算机或英语,在课程表中要查找课程名称中包含计算机的课程,对应课程名称字段的正确条件表达式是______。...
[判断题]搜索引擎的用户接口供用户输入查询要求并显示结果. [多选题]控制共聚物组成的方法有( )等. [单选题]分离外周血单个核细胞常用的分层液是 [单选题]产品结构就是以( ) 来实现产品各功能单 ...
- sql 插入text字段包含特殊字符_Kettle(PDI)转换中输出之插入/更新详解
概述 Insert / update(插入 / 更新)此步骤首先使用一个或多个查询关键字查找表中的一行.如果找不到该行,则插入该行.如果可以找到它,并且要更新的字段相同,则不执行任何操作.如果它们不完 ...
- mysql 过滤微信昵称表情_PHP正则过滤处理微信昵称中emoji字符的方法
本文实例讲述了PHP正则过滤处理微信昵称中emoji字符的方法.分享给大家供大家参考,具体如下: 今天刚做了一个微信应用,在获取微信昵称的过程中报错了,经查原因是微信昵称中包含emoji字符,在写入数 ...
- Java向数据库中插入数据出错时怎么避免插入错误数据
Java向数据库中插入数据出错时怎么避免插入错误数据 对于初学者,向数据库写数据时,当程序输错,会有错误的数据写入了数据库,这是可以用捕获异常回滚的方法避免这种情况的发生 代码如下: /** 完成增删 ...
最新文章
- python-mysql超简单银行转账Model(我说了很简单的)
- 编程范式,程序员的编程世界观(转)
- 配置Struts2.0
- 行人跟踪python_使用Python为初学者构建AI汽车和行人跟踪
- 如何分割合并ISO文件
- mock介绍及moco框架搭建使用
- 常用的oracle学习网站
- 自学JAVA的十大网站你都知道那些
- HCP数据的下载,以及头动文件和CSF文件的所在位置
- cad单位_CAD标注样式如何转换公制和英制
- 无线传感器网络MAC协议(下)
- java 打包发布_一个java项目的打包与发布
- java.sql.SQLException: sql injection violation, syntax error: TODO QUES
- 科研狗的英语翻译小众软件
- H3C交换机静态路由与NQA联动
- 怎样恢复计算机管理员身份,win10系统设置一直以管理员身份运行的恢复办法
- python的底层是c_Python的内存管理和垃圾回收机制:基于C语言源码底层深入剖析...
- 沙龙干货 Vol.1|如何让游戏广告收益不再艰难?演讲 PPT 免费领取!
- 分布式高可用高并发物联网(车联网-JT808协议)平台架构方案
- windows计划任务定时任务
热门文章
- 初探802.11协议(0)——开篇(IEEE802.11历史与Wi-Fi速率计算)
- oc引导windows蓝屏_使用Opencore引导ubuntu以及Linux的步骤
- 网盘变成本地硬盘教程
- JavaSE就业班四----数据库Oracle和JDBC
- oracle排列组合,Oracle SQL排列组合之排列问题
- 笔记本计算机信号不强,增强笔记本WiFi无线信号的方法
- 《稻盛和夫给年轻人的忠告》阅读笔记
- 移动硬盘上安装Ubuntu18.04系统
- 腾讯云部署node mysql_【腾讯云】配置安装node
- 【调剂】长江大学张菲菲教授招收硕士生