`
dove19900520
  • 浏览: 597478 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

MySQL中存储来源于IOS微信端emoji表情字符出错的解决方案

阅读更多

上周在做微信摄影投票时,遇到这么一个情况,在微信中,如果将用户昵称修改为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中了。
分享到:
评论

相关推荐

    java ipone 微信昵称emoji表情保存失败 问题解决

    本问题涉及的是一个典型的Java、iPhone和微信环境下的emoji表情存储问题。当iPhone 5s用户尝试在昵称中使用emoji表情时,这些表情无法成功保存到MySQL数据库中,导致报出"java.sql.SQLException: Incorrect string ...

    php 处理APP emoji表情包 IOS表情包 Mysql保存手机表情

    综上所述,处理和存储iOS的emoji表情包需要关注PHP环境的配置、MySQL数据库的设置以及数据传输过程中的字符编码。理解这些要点对于确保APP中的emoji能在服务器和数据库中顺利流通并正确显示至关重要。在实际开发中,...

    3种方法轻松处理php开发中emoji表情的问题

    微信作为一款广泛使用的社交平台,允许用户使用emoji作为昵称,但这些表情在存储到使用UTF8字符集的MySQL数据库时会出现问题。这是因为UTF8字符集只支持3字节的字符,而emoji表情是4字节的,导致数据无法正常存储,...

    在项目中使用Emoji表情【源代码】

    在数据库存储方面,由于Emoji也是Unicode字符,大多数现代数据库系统(如MySQL、PostgreSQL)都支持Unicode,可以直接存储和检索。但需要注意的是,选择正确的字符集(如UTF-8或UTF-8MB4)是至关重要的,以避免数据...

    mysql存储emoji表情步骤详解

    Caused by: java.sql.SQLException: Incorrect string value: ‘\xF0\x9F\x94\xA5’ for column Emoji表情存储到Mysql中时报错。 ios的表情(emoji表情),这种表情虽然是utf8编码,但是一个字符需要占用4个字节,而...

    iOS_Emoji:适用于iOS的表情符号

    由于server一开始并不支持emoji,现在你post含有emoji的数据到server,server会出现异常,主要是server的mysql开始的时候没有定义4位的字段,varchar都是3位的(普通的字符串或者表情都是占位3个字节,所以utf8足够用...

    emoji案例下载

    在IT行业中,尤其是在移动应用开发领域,表情符号(emoji)的使用已经成为不可或缺的一部分。"emoji案例下载"这个标题暗示我们即将探讨的是一个与emoji相关的项目案例,可能是一个库、工具或者是一个应用程序,它已...

    微信公众平台应用开发:方法、技巧与案例.(机械工业.柳峰)

    他还是一位资深的Java软件开发工程师和Android/iOS移动应用开发工程师,活跃于CocoaChina、开源中国、CSDN等社区,CSDN博客专家,在CSDN博客撰写了系列微信公众平台二次开发的教程,深受欢迎并被广泛传播,也因此...

    表情符号和Web应用程序

    标题中的“表情符号和Web应用程序”意味着我们要探讨的是在Web开发中如何使用和处理表情符号,特别是在HTML、JavaScript、移动设备(如iPhone和Android)以及服务器端技术(如PHP、MySQL和SQL Server)中的应用。...

Global site tag (gtag.js) - Google Analytics