由于之前做项目,把微信名称保存到数据库会报错,有些特殊字符的格式使用的是4个字节,而Mysql的UTF-8是三字节所以会发生报错。

解决步骤:

  • 修改该字段的编码格式:ALTER TABLE t_game_player CHANGE nickName nickName VARCHAR(255) CHARACTER SET utf8mb4;
    修改数据库的编码格式
  • WINDOWS上的数据库:在数据库根目录下找到my.ini(5.7版本好像默认是没有这个配置文件,可以自己创建一个),添加一行:character-set-server=utf8mb4,最后重启数据库就解决这个问题了。

通过代码解决:

我们现在知道原因出现在哪里我们可以把这些字符统一编码保存到库中,后面通过把字段进行base64编码在存入到数据库中,这样前端就得把该字段进行base64解码。

后端base64编码:

/**
* 编码
* @param msg
* @return
*/
public static String encodeToString(String msg){
//编码
String encodeBase64String=null;
try {
if (msg!=null){
encodeBase64String = Base64.encodeBase64String(msg.getBytes("UTF-8"));
System.out.println(encodeBase64String);
return encodeBase64String;
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}

return encodeBase64String;
}

前端base64解码:

/**
* 对后端的base64数据解析解码
* @param str
* @returns {string}
*/
function b64DecodeUnicode(str) {
return decodeURIComponent(
atob(str)
.split('')
.map(
function(c) {
return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
})
.join(''));
}

前端解析后端通过base64编码的数据_数据库

通过formatter函数把对应的列进行格式化输出

前端解析后端通过base64编码的数据_数据库_02

//操作栏的格式化
function actionFormatter(value, row, index) {
console.log("列"+row,"坐标"+index)
console.log(row.username+"---")

var username = b64DecodeUnicode(row.username);
console.log("解码:"+username)

var result = "";
result += username;
return result;
}

这样就可以吧微信名称解析出来

前端解析后端通过base64编码的数据_数据库_03