开发者社区> 暮角> 正文

DataX:导入4字节UTF8编码(生僻字)到Mysql数据库的utf8mb4数据表

简介: MySql数据库的编码支持UFT8字符集。utf-8编码可能是2个字节、3个字节、4个字节的字符,MYSQL的utf-8编码,只支持3个字节的字符。汉字中很多生僻字都是4个字节的字符,日常生活中人的姓名就会有很多高位的生僻字。
+关注继续查看

概述

MySql数据库的编码支持UFT8字符集。utf-8编码可能是2个字节、3个字节、4个字节的字符,MYSQL的utf-8编码,只支持3个字节的字符。汉字中很多生僻字都是4个字节的字符,日常生活中人的姓名就会有很多高位的生僻字。
如果直接使用datax同步数据到utf-8编码的数据库中,遇到高位字节的字符时,程序会抛异常。即便数据库中的表的字符集是设置为uft8mb4字符集。在datax异常日志中:

java.sql.BatchUpdateException:Incorrect string value:'xF0xA1x80x84' for column 'XXXX' at row 66.

如果在创建数据库实例的时候,就把实例创建成uft8mb4字符集,就不会出现这个问题。之前这个问题,datax是没有解决的,我都是通过重新创建数据库实例来实现。现在datax有方法可以解决这个问题,方法就是在jdbc配置中增加?com.mysql.jdbc.faultInjection.serverCharsetIndex=45。例如:

jdbc:mysql://ip:3306/testabc?com.mysql.jdbc.faultInjection.serverCharsetIndex=45

测试

建表语句
CREATE TABLE a (
name varchar(222) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
;

测试json
{

"job": {
    "setting": {
        "speed": {
            "channel": 1
        }
    },
    "content": [
        {
            "reader": {
                "name": "streamreader",
                "parameter": {
                    "sliceRecordCount": "2",
                    "column": [
                        {
                            "value": "??",
                            "type": "string"
                        }
                    ],
                    "charset": "UTF-8",
                    "fieldDelimiter": "\t"
                }
            },
            "writer": {
                "name": "mysqlwriter",
                "parameter": {
                    "username": "",
                    "password": "",
                    "column": [
                        "*"
                    ],
                    "connection": [
                        {
                            "table": [
                                "a"
                            ],
                            "jdbcUrl": "jdbc:mysql://ip:3306/testabc?com.mysql.jdbc.faultInjection.serverCharsetIndex=45"
                        }
                    ]
                }
            }
        }
    ]
}

}

感谢 一斆 老师,解决了这个问题。从2014年发现这个问题,到知道解决方法,我至少等了5年。

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

mysql> show variables like '%char%';
Variable_name Value ......
character_set_client utf8 ...... -- 客户端字符集
character_set_connection utf8 ......
character_set_database utf8 ...... -- 数据库字符集
character_set_filesystem binary ......
character_set_results utf8 ......
character_set_server utf8 ...... -- 服务器字符集
character_set_system utf8 ......
character_sets_dir D:MySQL Server 5.0sharecharsets\ ......

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

mysql> show table status from sqlstudy_db like '%countries%';
Name Engine Version Row_format Rows Collation ......
countries InnoDB 10 Compact 11 utf8_general_ci ......

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

mysql> show full columns from countries;
Field Type Collation .......
countries_id int(11) NULL .......
countries_name varchar(64) utf8_general_ci .......
countries_iso_code_2 char(2) utf8_general_ci .......
countries_iso_code_3 char(3) utf8_general_ci .......
address_format_id int(11) NULL .......

https://www.cnblogs.com/xiaogou/p/9123543.html

二、uft8mb4字符集
什么是utf8mb4
MySQL在5.5.3版本之后增加了这个utf8mb4的编码,mb4就是most bytes 4的意思,专门用来兼容四字节的unicode。

utf8与utf8mb4的联系
utf8mb4是utf8的超集(也就是说utf8mb4包含utf8),理论上原来使用utf8,然后将字符集修改为utf8mb4,也会不会对已有的utf8编码读取产生任何问题。当然,为了节省空间,一般情况下使用utf8也就够了。

为什么要用utf8mb4
低版本的MySQL支持的utf8编码,最大字符长度为 3 字节,如果遇到 4 字节的字符就会出现错误了。三个字节的 UTF-8 最大能编码的 Unicode 字符是 0xFFFF,也就是 Unicode 中的基本多文平面(BMP)。也就是说,任何不在基本多文平面的 Unicode字符,都无法使用MySQL原有的 utf8 字符集存储。
这些不在BMP中的字符包括哪些呢?最常见的就是Emoji 表情(Emoji 是一种特殊的 Unicode 编码,常见于 ios 和 android 手机上),和一些不常用的汉字,以及任何新增的 Unicode 字符等等。

链接:https://www.jianshu.com/p/f9073c8c85b9

其他类似文章:https://helpcdn.aliyun.com/document_detail/56136.html

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
django rest_framework中将json输出字符强制为utf-8编码
最近在和日本外包合作开发JIRA对接发布系统的版本单时, 遇到这个问题。 就是我们这边的输出浏览器显示为中文,而到了JIRA端就出现乱码。 查了文档,原来django rest_framework的默认json是没指定编码的, 需要随接收方的环境编码来显示。
1404 0
MySQL超时参数以及相关数据集成、DataX数据同步案例分享
一、背景 MySQL系统变量提供关于服务器的一些配置和能力信息,大部分变量可在mysqld服务进程启动时设置,部分变量可在mysqld服务进程运行时设置。合理的系统变量设值范围,是保障MySQL稳定提供服务的重要因素。
13407 0
《SQL与关系数据库理论——如何编写健壮的SQL代码》一一1.5 模型vs.实现
本节书摘来华章计算机《交互式程序设计 第2版》一书中的第1章 ,第1.5节,Joshua Noble 著 毛顺兵 张婷婷 陈宇 沈鑫 任灿江 译更多章节内容可以访问云栖社区“华章计算机”公众号查看。 1.5 模型vs.实现 在继续深入之前,有必要对一点进行解释,因为此点是本书所有讨论内容的基础。
900 0
eclipse中默认编码设置为UTF-8
eclipse中默认编码设置为UTF-8
38 0
C++转换unicode utf-8 gb2312编码
windows开发环境下用VC++6.0 对unicode 、utf-8、 gb2312 三种编码格式之间的转换方法:   [cpp] view plaincopy   #include    #include    #include    using namesp...
1286 0
+关注
暮角
阿里云GTS-交付技术部-技术中台组
18
文章
0
问答
来源圈子
更多
MaxCompute(原ODPS)是一项面向分析的大数据计算服务,它以Serverless架构提供快速、全托管的在线数据仓库服务,消除传统数据平台在资源扩展性和弹性方面的限制,最小化用户运维投入,使您经济并高效的分析处理海量数据。
+ 订阅
相关文档: MaxCompute
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载