让musql数据库支持表情存入

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

需求:表情存入数据库

原因:uft8最多可以存储占3个字符的数据,而emoji表情数据是四个字符,因此mysql的utf8无法存储会报错

解决方法

mysql5.5.3以前版本

1.urlencode转换(缺点:每次存入和取出都要加密和解密,而且一个字符经过处理后变成了12字节)

2.base64加密(缺点:每次存入和取出都要加密和解密,而且一个字符经过处理后变成了6字节)

emoji表情的正则表达式

各种语言的字符串替换方法("[\\x{10000}-\\x{10ffff}\ud800-\udfff]", "");

 

mysql5.5.3以后版本

1.上面的加密解密同样可以用

2.修改数据库字符集utf8mb4,这个字符集是支持表情存入的

注意:数据库字符集,表字符集自动字符集,当你发现所有字符集都改了,还是不行,那么请你检查下character_set_server     utf8mb4   (让数据库允许表情存入---需要重启数据库)

 

标签转换

 /** 
 * @Description 将字符串中的emoji表情转换成可以在utf-8字符集数据库中保存的格式(表情占4个字节,需要utf8mb4字符集) 
 * @param str 
 *            待转换字符串 
 * @return 转换后字符串 
 * @throws UnsupportedEncodingException 
 *             exception 
 */  
public static String emojiConvert1(String str)  
        throws UnsupportedEncodingException {  
    String patternString = "([\\x{10000}-\\x{10ffff}\ud800-\udfff])";  
  
    Pattern pattern = Pattern.compile(patternString);  
    Matcher matcher = pattern.matcher(str);  
    StringBuffer sb = new StringBuffer();  
    while(matcher.find()) {  
        try {  
            matcher.appendReplacement(  
                    sb,  
                    "[["  
                            + URLEncoder.encode(matcher.group(1),  
                                    "UTF-8") + "]]");  
        } catch(UnsupportedEncodingException e) {  
            LOG.error("emojiConvert error", e);  
            throw e;  
        }  
    }  
    matcher.appendTail(sb);  
    LOG.debug("emojiConvert " + str + " to " + sb.toString()  
            + ", len:" + sb.length());  
    return sb.toString();  
}  
  
/** 
 * @Description 还原utf8数据库中保存的含转换后emoji表情的字符串 
 * @param str 
 *            转换后的字符串 
 * @return 转换前的字符串 
 * @throws UnsupportedEncodingException 
 *             exception 
 */  
public static String emojiRecovery2(String str)  
        throws UnsupportedEncodingException {  
    String patternString = "\\[\\[(.*?)\\]\\]";  
  
    Pattern pattern = Pattern.compile(patternString);  
    Matcher matcher = pattern.matcher(str);  
  
    StringBuffer sb = new StringBuffer();  
    while(matcher.find()) {  
        try {  
            matcher.appendReplacement(sb,  
                    URLDecoder.decode(matcher.group(1), "UTF-8"));  
        } catch(UnsupportedEncodingException e) {  
            LOG.error("emojiRecovery error", e);  
            throw e;  
        }  
    }  
    matcher.appendTail(sb);  
    LOG.debug("emojiRecovery " + str + " to " + sb.toString());  
    return sb.toString();  
}  

 

转载于:https://my.oschina.net/u/1858920/blog/1559703

你可能感兴趣的:(数据库,python)