上周在做微信摄影投票时,遇到这么一个情况,在微信中,如果将用户昵称修改为Emoji表情字符后,再通过hibernate向MySQL存储时,报如下错误:
java.sql.SQLException: Incorrect string value: '\xF0\x9F\x92\x94' for column 'name' at row 1 at com..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)
原因是:MySQL中utf-8编码,一个字符占3个字节,但是微信Emoji表情字符,它的编码是utf8mb4编码的,一个字符占4个字节。就是因为这个原因,导致插入昵称时失败。
解决方案:
1、修改MySQL中对应表的昵称字段编码格式为utf8mb4;
2、放弃使用hibernate进行数据的存储或更新,改用纯jdbc的方式(hibernate的没研究过,不知道可不可以),代码片段如下:
String username = "root"; String password = "111111"; String className = "com.mysql.jdbc.Driver"; String url = "jdbc:mysql://127.0.0.1:3306/vote?autoReconnect=true&useUnicode=true&characterEncoding=utf-&zeroDateTimeBehavior=convertToNull"; Class.forName(className ); Connection conn = DriverManager.getConnection(url , username , password ); public static Long save(String sql, Object[] params){ Long ret = null; ResultSet rs = null; Connection conn = null; PreparedStatement cmd = null; try { conn = getDBConnection(); conn.setAutoCommit(true); //通过查询运行设置字符集的命令(这一句是重点) conn.prepareStatement("set names utf8mb4").executeQuery(); cmd = conn.prepareStatement(sql); if(params == null || params.length == 0){ return -1L; } for (int i = 0; i < params.length; i++) { cmd.setObject(i+1, params[i]); } cmd.executeUpdate(); // 获取最后一条插入数据的自增列值 String sql2 = "select @@IDENTITY"; cmd = conn.prepareStatement(sql2); rs = cmd.executeQuery(); if (rs.next()) { ret = Long.parseLong(rs.getObject(1)+""); } } catch (SQLException e) { e.printStackTrace(); logger.error(e.getMessage(), e); } finally { try { if(cmd != null){ cmd.close(); } if(rs != null){ rs.close(); } if(conn != null){ conn.close(); } } catch (SQLException e) { e.printStackTrace(); } } return ret; }完成上述修改之后,emoji表情字符就可以正常的插入到MySQL中了。
相关推荐
微信最新Emoji表情149个png打包.zip
微信467特殊表情字符与对应的微信识别字符+111张微信emoji表情图
原本想做个仿微信聊天室,需要微信的官方表情,但找了一天都没有找到满意的,所以自己截图再切图做了一个,打包就1个html和png文件夹,非常简洁;html文件打开就是示例效果,源码还包含了一个json数组,格式是:var ...
109个微信自带的emoji表情
141个微信emoji 微信emoji表情 仿微信emoji输入 安卓微信emoji 苹果微信emoji
android 仿微信Emoji表情demo
通讯软件开发
最全的高清微信官方表情
ipone5s中昵称输入“emoji 表情”,保存数据库有问题。 Caused by: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x8E\x80\xE5\xA4...' for column 'nickname' at row 1
微信emoji表情图片包,包含一个文本对应表情的文件,方便做表情相关开发使用的资源。
把微信中获取的表情标签如:<span class="emoji emoji1f631">,直接输出到HTML中,再引入本CSS文件即可识别显示。
qq微信默认emoji表情图片打包附带对照表和js正则替换示例php代码
使用JS处理从数据库取出或其它来源取出的emoji表情,只要调用一下就可以。附有完整的emoji表情图。
iOS系统风格的Emoji表情图片,图片大小72x72,png后缀,共3184个,Emoji的版本为v13.0。压缩包内提供PHP的使用示例,文档生成于2020年3月2日。
高仿微信emoji表情,自定义表情
微信emoji表情png
oracle不支持emoji表情的直接保存.可通过java解析为emoji字符进行存储.使用时再进行转化使之在移动端以emoji表情正常显示
判断字符串是否包含emoji表情
微信小程序添加emoji表情组件,雪碧图版本
部分微信emoji表情图片资源,保存留着将来使用。只有微信表情的前100多个,后面的表情有功夫可以再添加。