zoukankan      html  css  js  c++  java
  • 将爬取的网页数据保存到数据库时报错不能提交JPA,Caused by: java.sql.SQLException: Incorrect string value: 'xF0x9Fx98xB6 xE2...' for column 'content' at row 1

    错误原因:我们可以看到错误提示中的字符0xF0 0x9F 0x98 0x84 ,这对应UTF-8编码格式中的4字节编码(UTF-8编码规范)。正常的汉字一般不会超过3个字节,为什么为出现4个字节呢?实际上是它对应的是智能手机输入法中的表情。那为什么会报错呢?因为mysql中的utf-8并不是真正意义上的utf-8,它只能存储1~3个字节长度的utf-8编码,如果想存储4个字节的必须用utf8mb4类型。不而要使用utf8mb4类型,首先要保证Mysql版本要不低于 MySQL 5.5.3。

    常用字符集

      • ASCII:美国信息互换标准编码;英语和其他西欧语言;单字节编码,7位表示一个字符,共128字符。
      • GBK:双字节,汉字内码扩展规范;中日韩汉字、英文、数字;双字节编码;共收录了21003个汉字,GB2312的扩展。
      • UTF-8:Unicode标准的可变长度字符编码;Unicode标准(统一码),业界统一标准,包括世界上数十种文字的系统;
      • UTF-8:使用一至三个字节为每个字符编码。
      • utf8mb4:存储四个字节,应用场景用于存储emoji表情,因为可以emoji表情四个字节。
      • utf8mb4:MySQL版本 > 5.5.3 。
      • 其他常见字符集:UTF-32UTF-16Big5latin1
      • 数据库中的字符集包含两层含义 
        • 各种文字和符号的集合,包括各国家文字、标点符号、图形符号、数字等。
        • 字符的编码方式,即二进制数据与字符的映射规则。

    解决方案:

    1)使用utf8mb4数据类型

    [client]
    default-character-set = utf8mb4

    [mysql]
    default-character-set = utf8mb4

    [mysqld]
    character-set-server = utf8mb4
    collation-server = utf8mb4_unicode_ci

    将数据库中对应的字段,改为utf8mb4_general_ci

      # 对每一个数据库:

      ALTER DATABASE 这里数据库名字 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
      # 对每一个表:
      ALTER TABLE 这里是表名字 CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
      # 对每一个字段:
      ALTER TABLE 这里是表名字 CHANGE 字段名字 重复字段名字 VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
      # 上面一句或者使用modify来更改
      ALTER TABLE 这里是表名字 modify 字段名字 VARCHAR(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '';
      utf8mb4完全向后兼容utf8,无乱码或其他数据丢失的形式出现。理论上是可以放心修改… 还是修改数据库比较方便。


    修改项目中的连接数据库的url,将characterEncoding=utf-8去掉,此步骤一定要进行

    2)自定义过滤规则,将文本中出现的四字节UTF-8字符过滤或转化为自定义类型。

    下面是将4字节字符转化为0000的测试例子。

    for (int i = 0; i < b_text.length; i++) 

      if((b_text[i] & 0xF8)== 0xF0){
        for (int j = 0; j < 4; j++) {
        b_text[i+j]=0x30;
      }
      i+=3;
      }
    }

    3)改成gbk编码也可以,不过我没试过

    查看三种MySQL字符集的方法

    一、查看MySQL数据库服务器和数据库MySQL字符集。

    1. mysql> show variables like '%char%';  

    二、查看MySQL数据表(table)的MySQL字符集。

    1. mysql> show table status from sqlstudy_db like '%countries%';  

    三、查看MySQL数据列(column)的MySQL字符集。

      1. mysql> show full columns from countries; 
  • 相关阅读:
    Url中文传值乱码、编码转码问题总结
    简单介绍下我使用了一年多还不知道的Sql server 2005 组件知识
    一次管理项目小组网络的经历(使用RouterOS与Wireshark破解adsl上网密码,使用isa与Bandwidth Splitter来协调带宽)
    asp.net异步处理机制研究
    注释的力量
    AutoMapper简明教程(学习笔记)
    seajs学习笔记
    Hifi入门
    fxcop使用DataFlowRules规则集
    Visual Studio编译选项简介
  • 原文地址:https://www.cnblogs.com/qianzf/p/8324012.html
Copyright © 2011-2022 走看看