博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MySql 中文写入数据库乱码及Incorrect string value: '\xF0\x9F...' for column 'XXX' at row 1解决...
阅读量:6004 次
发布时间:2019-06-20

本文共 3605 字,大约阅读时间需要 12 分钟。

一、中文写入乱码问题


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

原url地址是

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

改为

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

就OK了。

二、Incorrect string value: '\xF0\x9F...' for column 'XXX' at row 1


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

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

Java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\x8E' for column 'nick' at row 1

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

解决的方案有两种:

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

方法1:使用utf8mb4的mysql编码来容纳这些字符


注意:要使用 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。不过我没有做这一步,也正常,所以可能是这一步是多余的。

方法2:过滤掉这些特殊的字符


import org.apache.commons.lang.StringUtils;public class charUtil {    /**     * 替换四个字节的字符 '\xF0\x9F\x98\x84\xF0\x9F)的解决方案 ��     */    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("[\\ud800\\udc00-\\udbff\\udfff\\ud800-\\udfff]", "*");        } else {            return source;        }    }    public static void main(String[] arg) {        try {            System.err.println("测试->将emoji表情替换成*");            String text = "This is a smiley \uD83C\uDFA6 face\uD860\uDD5D \uD860\uDE07 \uD860\uDEE2 \uD863\uDCCA \uD863\uDCCD \uD863\uDCD2 \uD867\uDD98 ";            System.out.println(text);            System.out.println(text.length());            System.out.println(text.replaceAll("[\\ud83c\\udc00-\\ud83c\\udfff]|[\\ud83d\\udc00-\\ud83d\\udfff]|[\\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("测试->替换四个字节的字符 '\\xF0\\x9F\\x98\\x84\\xF0\\x9F)的解决方案 ��");            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();        }    }}

转载于:https://www.cnblogs.com/liupeifeng3514/p/10214392.html

你可能感兴趣的文章
sed 指令
查看>>
在Android上用AChartEngine轻松绘制图表
查看>>
Redis之序列化POJO
查看>>
移动端 Web 开发前端知识整理
查看>>
dd&win32diskimager&软碟通Ultraiso 简单分析区别和长处
查看>>
正则式 - 大于等于-9
查看>>
Eclipse 出错 Error:Could not create the Java Virtual Machine Error:A fatal exception has occurred
查看>>
以前的 Delphi版本
查看>>
[转]Redis几个认识误区
查看>>
【小白的CFD之旅】18 控制方程基础
查看>>
待看问题
查看>>
PHP跨页面传递时session失效
查看>>
Linux用户管理-中
查看>>
HTML5笔记3——Web Storage和本地数据库
查看>>
哈希表之四查找及分析
查看>>
Angularjs Post传值后台收不到的原因
查看>>
stderr和stdout详细解说(转)
查看>>
【其他】VS提示不一致的行尾
查看>>
webpack CommonsChunkPlugin 提取公共代码
查看>>
oracle创建存储过程
查看>>