最近在项目中遇到一个问题,服务端在向数据库插入数据时报错: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了一点,但是也解决了项目中,目前所遇到的问题。倘若后面验证了修改字符集后重启数据库可行的话,还是会使用更换数据库字符集的方案,毕竟这种特殊字符在很多地方都会出现,每一次都特殊处理很麻烦。