服務端儲存特殊字元解決方案
阿新 • • 發佈:2018-12-20
最近在專案中遇到一個問題,服務端在向資料庫插入資料時報錯:Error updating database. Cause: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\x8A' for column 'msg' at row 1。在網上搜了很多,找到無非是更換資料庫字符集之類的,但是試了好像沒有效果,有的地方說更換字符集後需要重啟資料庫(暫時還沒有驗證)。
後來在又看到其他地方講了一個方法,試了可行,先記錄在此:
/** * 字串與unicode的相互轉換工具類 * @author Xinx. * @date 2018/11/5 17:57 */ public class UnicodeConvertUtil { /** * 將字串轉成unicode * @param string 待轉字串 * @return 普通字串 */ public static String string2Unicode(String string) { StringBuffer unicode = new StringBuffer(); for (int i = 0; i < string.length(); i++) { // 取出每一個字元 char c = string.charAt(i); // 轉換為unicode unicode.append("\\u" + Integer.toHexString(c)); } return unicode.toString(); } /** * 將unicode轉成字串 * @param unicode 待轉字串 * @return unicode字串 */ public static String unicode2String(String unicode) { if (unicode.indexOf("\\u") == -1)//如果不是unicode碼則原樣返回 return unicode; StringBuffer string = new StringBuffer(); String[] hex = unicode.split("\\\\u"); for (int i = 1; i < hex.length; i++) { // 轉換出每一個程式碼點 int data = Integer.parseInt(hex[i], 16); // 追加成string string.append((char) data); } return string.toString(); } }
大致的原理就是拿到前端傳來的資料後,現將資料轉換成unicode字串,存入資料庫。資料取出來時,再將unicode轉回去。儘管方法low了一點,但是也解決了專案中,目前所遇到的問題。倘若後面驗證了修改字符集後重啟資料庫可行的話,還是會使用更換資料庫字符集的方案,畢竟這種特殊字元在很多地方都會出現,每一次都特殊處理很麻煩。