Oracle数据到MaxCompute乱码问题详解

简介:集成Oracle数据到MaxCompute,乱码问题分析; 为什么,在oracle数据不乱码,集成到MaxCompute就乱码了? 问题在哪里?

1.1 乱码现象

DataWorks的数据离线集成(DataX)集成Oracle数据到MaxCompute的数据有乱码,但是看源库不是乱码,这是什么原因?

现象:【Oracle;工具:plsql-dev】

image.png

【MaxCompute;工具:DataWorks】

select OP_USER from test.mdtsb where

uuid='161A45E75BC88040E053441074848040';

image.png

1.2 问题分析

使用两个 oracle 函数:

【DUMP; CONVERT;

DUMP

CONVERT

为了避免转码正确是因为刚好乱码的列的真实字符集与操作系统字符集相同而导致显示正常,选择了使用 linux 环境,客户端字符集设置为 UTF8,使用 SQLplus 进行查询分析问题。

1.客户端环境:

SQL> select userenv('language') from dual;

USERENV('LANGUAGE')

----------------------------------------------------

SIMPLIFIED CHINESE_CHINA.AL32UTF8

2.使用 dump 函数把文本对应的编码输出出来:

SQL> select dump(OP_USER,1016) from test.mdtsb where

uuid='161A45E75BC88040E053441074848040' ;

DUMP(OP_USER,1016)

----------------------------------------------------

Typ=1 Len=6CharacterSet=AL32UTF8: c0,ee,be,b0,ea,bb

这个函数输出的信息有三个

  1. 长度是 6 字节
  2. 字符集是 AL32UTF8
  3. 字符编码是 c0,ee,be,b0,ea,bb

通过这些信息,我们猜测原来的字符集可能是 GBK 或者 GB18030、GB2312 这几个字符集的编码。因为三个汉字,如果是 UTF8 的话他们的编码大部分都是一个汉字对应三字节。而 GBK字符集对应的编码是双字节。

3.查看c0,ee,be,b0,ea,bb 对应的 GBK 字符

GBK 编码范围, GBK 编码表

c0,ee

image.png

be,b0

image.png

ea,bb

image.png

所以,可以认定这个字符编码属于 GBK 类。

4.对应汉子的 GBK 类编码

汉字字符集编码查询;中文字符集编码:GB2312、BIG5、GBK、GB18030、Unicode

GB2312 编码:C0EE

BIG5 编码:A7F5

GBK 编码:C0EE

GB18030 编码:C0EE

Unicode 编码:674E

GB2312 编码:BEB0

BIG5 编码:B4BA

GBK 编码:BEB0

GB18030 编码:BEB0

Unicode 编码:666F

GB2312 编码:EABB

BIG5 编码:A9FE

GBK 编码:EABB

GB18030 编码:EABB

Unicode 编码:660A

可以看到,这三个汉字可能的编码是:GB2312、GB18030、GBK。

5.使用 convert 函数转换字符串编码为 AL32UTF8

SQL> select convert(OP_USER,'AL32UTF8','ZHS16GBK') from test.mdtsb where

uuid='161A45E75BC88040E053441074848040' ;

CONVERT(OP_USER,' AL32UTF8','ZHS16GBK')

-------------------------------------------------------

李景昊

这个结果验证了我们的猜测,这个字符集应该是 GBK 类的字符集,但是因为 GBK 和 GB18030、GB2312 并不是完全父子集关系,所以,这个只能是其中的一种。只不过 GBK 字符集从当前角度来看,更为常用。

SQL> select convert(OP_USER,'AL32UTF8','ZHS16GBK') from test.mdtsb where

uuid='161A45E75BC88040E053441074848040' ;

CONVERT(OP_USER,' AL32UTF8','ZHS16CGB231280')

-------------------------------------------------------

李景昊

SQL> select convert(OP_USER,'AL32UTF8','ZHS16GBK') from test.mdtsb where

uuid='161A45E75BC88040E053441074848040' ;

CONVERT(OP_USER,' AL32UTF8','ZHS32GB18030')

-------------------------------------------------------

李景昊

6.查询这三个汉字对应的UTF8 的字符串编码

网址:Unicode编码转换,UTF编码转换(UTF-8、UTF-16、UTF-32)

Unicode 编码:0000674E

UTF8 编码:E69D8E

UTF16 编码:FEFF674E

UTF32 编码:0000FEFF0000674E

Unicode 编码:0000666F

UTF8 编码:E699AF

UTF16 编码:FEFF666F

UTF32 编码:0000FEFF0000666F

Unicode 编码:0000660A

UTF8 编码:E6988A

UTF16 编码:FEFF660A

UTF32 编码:0000FEFF0000660A

所以,如果原来字符串编码是 UTF8,理论上我们通过 dump 函数获取的字符串编码应该为:e6,9d,8e,e6,99,af,e6,98,8a

1.3 问题解决

通过 convert 函数转换:

SQL> select dump(convert(OP_USER,'AL32UTF8','ZHS16GBK'),1016) from test.mdtsb

where uuid='161A45E75BC88040E053441074848040' ;

DUMP(CONVERT(OP_USER,' AL32UTF8','ZHS16GBK'),1016)

-------------------------------------------------------

Typ=1 Len=9CharacterSet=AL32UTF8: e6,9d,8e,e6,99,af,e6,98,8a

这个结果验证了我们之前的查询结果,UTF8 字符集显示的编码应该是:

e6,9d,8e,e6,99,af,e6,98,8a。

结论:

Oracle 数据库存储的该列的实际编码是GBK 类的字符集,因为与客户端环境的字符编码相同,所以,刚好能显示出来。但是因为 Oracle 存储的字符集设置为 UTF8,实际上存储的字符集应该是 UTF8。所以导致标注的编码和实际的编码不一致-乱码。

应对:

在数据同步任务的对应的列上通过测试字符集获取到的真实字符集,使用 convert 函数(convert(OP_USER,'AL32UTF8','ZHS16GBK'))进行转换,转换到 ODPS 后的数据就不会再是乱码。

例如:SELECT convert(KEY1,'ZHS16GBK','UTF8') FROM MATDOC;

【MaxCompute;工具:DataWorks】

select OP_USER from MaxCompute.MDTSB where uuid='161A45E75BC88040E053441074848040';

 

image.png

1.4  目标端识别方法

其实在MaxCompute也有相关的函数可以对字符编码进行分析和转换,只是我们在MaxCompute只能存储一种字符集“UTF-8”,所以,最好是在源端或者在传输过程中转换编码为UTF-8。下面两个函数是MaxCompute的字符编码相关函数。

·       ENCODE

命令格式

binary encode(string <str>, string )

命令说明

将str按照charset格式进行编码。

参数说明

str:必填。STRING类型。待重新编码的字符串。

charset:必填。STRING类型。编码格式。取值范围为:UTF-8、UTF-16、UTF-16LE、UTF-16BE、ISO-8859-1、US-ASCII。

返回值说明

返回BINARY类型。任一输入参数为NULL时,返回结果为NULL。

示例

示例1:将字符串abc按照UTF-8格式编码。命令示例如下。

select encode("abc", "UTF-8");

--返回abc。

 

·       IS_ENCODING

命令格式

boolean is_encoding(string <str>, string , string )

命令说明

判断输入的字符串str是否可以从指定的一个字符集from_encoding转为另一个字符集to_encoding。也可以用于判断输入是否为乱码,通常您可以将from_encoding设为UTF-8,to_encoding设为GBK。

参数说明

str:必填。STRING类型。空字符串可以被认为属于任何字符集。

from_encoding、to_encoding:必填。STRING类型,源及目标字符集。

返回值说明

返回BOOLEAN类型。如果str能够成功转换,则返回True,否则返回False。如果任一输入参数为NULL,则返回NULL。

示例

示例1:判断字符测试或測試是否可以从utf-8字符集转为gbk字符集。命令示例如下。

select is_encoding('测试', 'utf-8', 'gbk');

--返回true。

select is_encoding('測試', 'utf-8', 'gbk');

--返回true。

字符串函数 - 云原生大数据计算服务 MaxCompute - 阿里云

1.5  附录

Convert函数

image.png

Purpose

CONVERT converts a character string from one character set to another. The datatype of the returned value is VARCHAR2.

  • The char argument      is the value to be converted. It can be any of the datatypes CHAR, VARCHAR2, NCHAR, NVARCHAR2, CLOB, or NCLOB.
  • The dest_char_set argument is the name of the character set to which char is converted.
  • The source_char_set argument is the name of the character set in which char is stored in the database. The default      value is the database character set.

Both the destination and source character set arguments can be either literals or columns containing the name of the character set.

For complete correspondence in character conversion, it is essential that the destination character set contains a representation of all the characters defined in the source character set. Where a character does not exist in the destination character set, a replacement character appears. Replacement characters can be defined as part of a character set definition.

Examples

The following example illustrates character set conversion by converting a Latin-1 string to ASCII. The result is the same as importing the same string from a WE8ISO8859P1 database to a US7ASCII database.

SELECT CONVERT('Ä Ê Í Ó Ø A B C D E ', 'US7ASCII', 'WE8ISO8859P1')

  FROM DUAL;

CONVERT('ÄÊÍÓØABCDE'

---------------------

A E I ? ? A B C D E ?

【'US7ASCII'是当前oracle数据库的字符集,'WE8ISO8859P1'是被转换后的字符集】

Common character sets include:

· US7ASCII: US 7-bit ASCII character set

· WE8DEC: West European 8-bit character set

· F7DEC: DEC French 7-bit character set

· WE8EBCDIC500: IBM West European EBCDIC Code Page 500

· WE8ISO8859P1: ISO 8859-1 West European 8-bit character set

· UTF8: Unicode 4.0 UTF-8 Universal character set, CESU-8 compliant

· AL32UTF8: Unicode 4.0 UTF-8 Universal character set

原文链接
本文为阿里云原创内容,未经允许不得转载。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/511763.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Gartner:2022年全球半导体收入预计将增长13.6%

半导体元件供应链所受到的限制预计将在2022年逐步缓解 根据Gartner的预测&#xff0c;2022年全球半导体收入预计将达到6760亿美元&#xff0c;相比2021年增长13.6%。 Gartner研究副总裁Alan Priestley表示&#xff1a; “由于芯片短缺而引发的半导体平均销售价格&#xff08;AS…

V8 编译浅谈

简介&#xff1a;本文是一个 V8 编译原理知识的介绍文章&#xff0c;旨在让大家感性的了解 JavaScript 在 V8 中的解析过程。 作者 | 子弈 来源 | 阿里技术公众号 一 简介 本文是一个 V8 编译原理知识的介绍文章&#xff0c;旨在让大家感性的了解 JavaScript 在 V8 中的解析过…

rabbitmq接收不到消息 防火墙_用PHP+RabbitMQ实现消息的发送和接收

消费者&#xff1a;接收消息逻辑&#xff1a;创建连接-->创建channel-->创建交换机-->创建队列-->绑定交换机/队列/路由键-->接收消息<?php /************************************* * PHP amqp(RabbitMQ) Demo - consumer * Author: Linvo * Date: 2018/7/…

斩获大奖|阿里云PolarDB-X引领云原生分布式数据库新时代

简介&#xff1a;阿里云原生分布式数据库PolarDB-X荣获“2021年度最佳分布式数据库”。 12月15-16日&#xff0c;以“引领分布式云变革 助力湾区数字经济”为主题的全球分布式云大会在深圳隆重召开&#xff0c;本届大会由全球分布式云联盟、深圳科技交流服务中心、深圳市通信学…

Gartner:2022年中国IT支出预计将突破5.5亿美元

2022年全球IT支出预计将达到4.4万亿美元&#xff0c;2022年中国IT支出预计将突破5.5亿美元&#xff0c;相比2021年增长7.76% 分析、云计算、无缝客户体验和安全等领域将成为首席信息官的重点采购和投资领域 根据Gartner的最新预测&#xff0c;2022年全球IT支出预计将达到4.4万亿…

深度 | 从DevOps到BizDevOps, 研发效能提升的系统方法

简介&#xff1a;研发效能提升不知从何下手、一头雾水&#xff1f;阿里资深技术专家一文为你揭秘研发效能提升的系统方法。 注&#xff1a;本文是对云栖大会何勉分享内容的整理 这几年“研发效能”一直是热词&#xff0c;很多组织都会启动研发效能提升专项。我与其中的很多有过…

mac mysql 链接_mac上搭建mysql环境配置和Navicat连接mysql

mac上搭建mysql环境配置注意&#xff1a;mysql版本要和你的MAC版本保持一致2、一路傻瓜式点击下一步此处选择“Use Legacy Password Encryption”&#xff0c;否则使用navicat连接mysql的时候&#xff0c;会报无法加载身份验证的错误。3、环境配置打开终端&#xff0c;输入&…

io_uring vs epoll ,谁在网络编程领域更胜一筹?

简介&#xff1a;从定量分析的角度&#xff0c;通过量化 io_uring 和 epoll 两种编程框架下的相关操作的耗时&#xff0c;来分析二者的性能差异。 本文作者&#xff1a;王小光&#xff0c;「高性能存储技术SIG」核心成员。 背景 io_uring 在传统存储 io 场景已经证明其价值&a…

Redis 为何使用近似 LRU 算法淘汰数据,而不是真实 LRU?

作者 | 码哥呀来源 | CSDN博客在《Redis 数据缓存满了怎么办&#xff1f;》我们知道 Redis 缓存满了之后能通过淘汰策略删除数据腾出空间给新数据。淘汰策略如下所示&#xff1a;redis内存淘汰设置过期时间的 keyvolatile-ttl、volatile-random、volatile-lru、volatile-lfu 这…

量化感知训练实践:实现精度无损的模型压缩和推理加速

简介&#xff1a;本文以近期流行的YOLOX[8]目标检测模型为例&#xff0c;介绍量化感知训练的原理流程&#xff0c;讨论如何实现精度无损的实践经验&#xff0c;并展示了量化后的模型能够做到精度不低于原始浮点模型&#xff0c;模型压缩4X、推理加速最高2.3X的优化效果。 1. 概…

此表单只能填写一次_暴雪战网国服账号修改邮箱只能填写表单申请

暴雪战网国服账号只认身份信息&#xff0c;注册必须实名&#xff0c;而且实名信息千万不要乱填&#xff0c;不然账号出现问题&#xff0c;需要上传证件图片的&#xff0c;客服会核实与注册实名内容是否一致&#xff0c;不然无法帮助玩家解决一些问题。国服账号邮箱没有什么权限…

贾扬清演讲实录:一个AI开发者的奇幻漂流

简介&#xff1a;2021阿里灵杰AI工程化峰会&#xff0c;贾扬清深度解读阿里灵杰大数据和AI一体化平台。 演讲人&#xff1a;贾扬清 演讲主题&#xff1a;一个AI开发者的奇幻漂流 活动&#xff1a;2021阿里灵杰AI工程化峰会 对于绝大多数人来说&#xff0c;这一波AI浪潮兴许…

上云避坑指南100篇|「云」上玩法虽多,小心水土不服

商业智能BI发展至今&#xff0c;从市场增速来看&#xff0c;我国已进入 BI 及 DA&#xff08;数据分析&#xff09;领域的第一方阵&#xff0c;并成为发展最快的国家之一。 IDC 数据显示&#xff0c;2020 年中国商业智能软件市场规模为 5.8 亿美元&#xff0c;同比增长 17.1%&a…

如何基于LSM-tree架构实现一写多读

简介&#xff1a;传统MySQL基于binlog复制的主备架构有它的局限性&#xff0c;包括存储空间有限&#xff0c;备份恢复慢&#xff0c;主备复制延迟等问题&#xff0c;为了解决用户对于云上RDS(X-Engine)大容量存储&#xff0c;以及弹性伸缩的诉求&#xff0c;PolarDB推出了历史库…

Dubbo-go v3.0 正式发布 ——打造国内一流开源 Go 服务框架

简介&#xff1a;Dubbo-go 是常新的&#xff0c;每年都在不断进化。介绍 Dubbo-go 3.0 工作之前&#xff0c;先回顾其过往 6 年的发展历程&#xff0c;以明晰未来的方向。 作者 | 李志信 来源 | 阿里技术公众号 作者介绍&#xff1a; 李志信&#xff08;github laurencelizhix…

谁还没经历过死锁呢?

作者 | 敖丙来源 | 敖丙之前刚学习多线程时&#xff0c;由于各种锁的操作不当&#xff0c;经常不经意间程序写了代码就发生了死锁&#xff0c;不是在灰度测试的时候被测出来&#xff0c;就是在代码review的时候被提前发现。这种死锁的经历不知道大家有没有&#xff0c;不过怎么…

阿里巴巴超大规模Kubernetes基础设施运维体系解读

简介&#xff1a;ASI&#xff1a;Alibaba Serverless infrastructure&#xff0c;阿里巴巴针对云原生应用设计的统一基础设施。ASI 基于阿里云公共云容器服务 ACK之上&#xff0c;支撑集团应用云原生化和云产品的Serverless化的基础设施平台。 作者 | 仔仁、墨封、光南 来源 | …

搜索NLP行业模型和轻量化客户定制

简介&#xff1a;开放搜索NLP行业模型和轻量化客户定制方案&#xff0c;解决减少客户标注成本、完全无标注或少量简单标注的等问题&#xff0c;让搜索领域扩展更易用。 特邀嘉宾&#xff1a; 徐光伟&#xff08;昆卡&#xff09;--阿里巴巴算法专家 搜索NLP算法 搜索链路 …

CICD 的供应链安全工具 Tekton Chains

作者 | Addo Zhang来源 | 云原生指北软件供应链是指进入软件中的所有内容及其来源&#xff0c;简单地可以理解成软件的依赖项。依赖项是软件运行时所需的重要内容&#xff0c;可以是代码、二进制文件或其他组件&#xff0c;也可以是这些组件的来源&#xff0c;比如存储库或者包…

python计算不规则图形面积_python opencv中的不规则形状检测和测量

正如我在评论中提到的那样,对于这个问题,分水岭似乎是一个很好的方法.但是当你回答时,定义标记的前景和背景是困难的部分&#xff01;我的想法是使用形态梯度沿着冰晶获得良好的边缘并从那里开始工作;形态梯度似乎很有效.import numpy as npimport cv2img cv2.imread(image.pn…