mysql中一些字节如何计算,DataX:导入4字节UTF8编码(生僻字)到Mysql数据库的utf8mb4数据表...

概述

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值