讓musql數據庫支持表情存入

需求:表情存入數據庫

緣由:uft8最多能夠存儲佔3個字符的數據,而emoji表情數據是四個字符,所以mysql的utf8沒法存儲會報錯java

解決方法

mysql5.5.3之前版本

1.urlencode轉換(缺點:每次存入和取出都要加密和解密,並且一個字符通過處理後變成了12字節)mysql

2.base64加密(缺點:每次存入和取出都要加密和解密,並且一個字符通過處理後變成了6字節)正則表達式

emoji表情的正則表達式

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

 

mysql5.5.3之後版本

1.上面的加密解密一樣能夠用sql

2.修改數據庫字符集utf8mb4,這個字符集是支持表情存入的數據庫

注意:數據庫字符集,表字符集自動字符集,當你發現全部字符集都改了,仍是不行,那麼請你檢查下character_set_server     utf8mb4   (讓數據庫容許表情存入---須要重啓數據庫)app

 

標籤轉換

/** 
 * @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();  
}
相關文章
相關標籤/搜索