加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

MySql 中文写入数据库乱码及Incorrect string value: '\

发布时间:2020-12-11 23:58:04 所属栏目:MySql教程 来源:网络整理
导读:h3 id="一中文写入乱码问题"一、中文写入乱码问题 我输入的中文编码是 urf8 的,建的库是 urf8 的,但是插入MySQL总是乱码,一堆"???????????????????????"。可以使用以下的方式试试决解: 原url地址是 jdbc:mysql://localhost:3306/数据库名 改为 jdbc:mysq

<h3 id="一中文写入乱码问题">一、中文写入乱码问题


我输入的中文编码是 urf8 的,建的库是 urf8 的,但是插入MySQL总是乱码,一堆"???????????????????????"。可以使用以下的方式试试决解:

原url地址是

jdbc:mysql://localhost:3306/数据库名

改为

jdbc:mysql://localhost:3306/数据库名?useUnicode=true&characterEncoding=UTF-8

就OK了。


做有关微信公众账号的项目时,报Incorrect string value: 'xF0x9Fx98x92' for column 'NIKENAME' at row 1,而所有的字符编码都是 utf8,使用的数据库是 mysql,在测试环境用得好好的,部署到线上后(使用的集群是阿里巴巴的,数据库服务器也是使用它们的,mysql 服务器版本是 5.5.18),就报这个错了,并且这个错,时而出现,时而不出现

Emoji表情字符现在在APP已经广泛支持了。但是MySQL的UTF8编码对Emoji字符的支持却不是那么好。所以我们经常会遇到这样的异常:

Java.sql.SQLException: Incorrect string value: 'xF0x9Fx98x8E' for column 'nick' at row 1

原因是MySQL里 urf8 编码最多只能支持3个字节,而Emoji表情字符使用的 urf8 编码,很多都是4个字节,有些甚至是6个字节。

解决的方案有两种:

  1. 使用 utf8mb4 的 mysql 编码来容纳这些字符;
  2. 过滤掉这些特殊的表情字符。


注意:要使用 utf8mb4 类型,首先要保证MySQL版本要不低于 MySQL 5.5.3。

第一步:在mysql的安装目录下找到my.ini,作如下修改:

[client] 
default-character-set = utf8mb4 
[mysql] 
default-character-set = utf8mb4 
[mysqld] 
character-set-client-handshake = FALSE 
character-set-server = utf8mb4 
collation-server = utf8mb4_unicode_ci 
init_connect='SET NAMES utf8mb4'

修改后重启Mysql。

第二步:将已经建好的表也转换成 utf8mb4

alter table TABLE_NAME convert to character set utf8mb4 collate utf8mb4_bin; 

将 TABLE_NAME 替换成你的表名。然后就OK了。

网上流传的一个版本增加了一个步骤,就是以 root 身份登录 Mysql,修改环境变量,将

character_set_client,character_set_connection,character_set_database,character_set_results,character_set_server

都修改成 utf8mb4。不过我没有做这一步,也正常,所以可能是这一步是多余的。


import org.apache.commons.lang.StringUtils;

public class charUtil {
/**

  • 替换四个字节的字符 'xF0x9Fx98x84xF0x9F)的解决方案 ??
    */
    public static String removeFourChar(String content) {
    byte[] conbyte = content.getBytes();
    for (int i = 0; i < conbyte.length; i++) {
    if ((conbyte[i] & 0xF8) == 0xF0) {
    for (int j = 0; j < 4; j++) {
    conbyte[i + j] = 0x30;// 0x30 int=48 字符=0
    }
    i += 3;
    }
    }
    content = new String(conbyte);
    return content.replaceAll("0000","");
    }
/**
 * 将emoji表情替换成*
 * @return 过滤后的字符串
 * 过滤的方式很简单,直接使用正则表达式匹配编码范围,然后替换就行了。
 */
public static String filterEmoji(String source) {
    if (StringUtils.isNotBlank(source)) {
        return source.replaceAll("[ud800udc00-udbffudfffud800-udfff]","*");
    } else {
        return source;
    }
}

public static void main(String[] arg) {
    try {
        System.err.println("测试->将emoji表情替换成*");
        String text = "This is a smiley uD83CuDFA6 faceuD860uDD5D uD860uDE07 uD860uDEE2 uD863uDCCA uD863uDCCD uD863uDCD2 uD867uDD98 ";
        System.out.println(text);
        System.out.println(text.length());
        System.out.println(text.replaceAll("[ud83cudc00-ud83cudfff]|[ud83dudc00-ud83dudfff]|[u2600-u27ff]","*"));
        System.out.println(filterEmoji(text));
        //输出结果
        //This is a smiley ?? face?? ?? ?? ?? ?? ?? ?? 
        //45
        //This is a smiley * face?? ?? ?? ?? ?? ?? ?? 
        //This is a smiley * face* * * * * * * 

        System.err.println("测试->替换四个字节的字符 'xF0x9Fx98x84xF0x9F)的解决方案 ??");
        String title = "ff的范德萨分????????Llfldakf;dsk。f????????????daslfjdsa;lfkjdsd'j'l'f'k'd'j'sa'l'k";
        System.out.println(removeFourChar(title));
        //输出结果:ff的范德萨分Llfldakf;dsk。fdaslfjdsa;lfkjdsd'j'l'f'k'd'j'sa'l'k

    } catch (Exception ex) {
        ex.printStackTrace();
    }
}

}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读