简介:将Oracle数据集成到MaxCompute,以及乱码问题的问题;为什么在Oracle数据中,它没有被弄乱,并且被插入以集成到MaxCompute?哪里有问题?
DataWorks的数据是离线(Datax)集成的Oracle数据以达到MaxCompute数据,但对于源库来说并不是乱码。是什么原因?
现象:[oracle;工具:PLSQL-DEV]
[MaxCompute;工具:dataworks]
从test.mdtsb中选择op_user
UUID ='161A45E75BC88040E053441074848040';
使用两个Oracle功能:
【倾倒;转变;】
http://docs.oracle.com/database/122/sqlrf/dump.htm#sqlrf00635
http://docs.oracle.com/database/122/sqlrf/convert.htm#sqlrf00620
为了避免正确的转编码,是因为Just Glabled列的真实字符集与操作系统字符集相同,显示为正常。选择了Linux环境。客户端字符集设置为UTF8,SQLPLU用于查询和分析问题。
1.熟悉环境:
sql>从dual中选择usernv('language');
USERENV(“语言”)
------------------------------------------------------------------------------------- -
简化中文_CHINA.AL32UTF8
2.将转储功能输出文本的相应编码:
SQL>从test.mdtsb中选择转储(OP_USER,1016)
UUID ='161A45E75BC88040E053441074848040';
转储(OP_USER,1016)
------------------------------------------------------------------------------------- -
typ = 1 len = 6characterset = al32utf8:c0,ee,be,b0,ea,bb
有三个信息输出此功能输出
1.长度为6个字节
2.字符集为AL32UTF8
3.字符编码为C0,EE,B0,EA,BB
通过这些信息,我们猜测原始字符集可能是GBK或GB18030的字符集的编码,GB231222.B23122.由于三个中文字符,如果它们是UTF8,则大多数代码是对应于三个字节的中文字符。编码。对应于GBK字符集的对应于双字节。
3.查看与C0,EE,BE,B0,EA,BB相对应的GBK字符
http://www.qqxiuzi.cn/zh/hanzi-gbk-bianma.php
C0,EE
是,B0
EA,BB
因此,可以确定该字符编码属于GBK类。
4.与男人相对应的GBK编码
http://www.qqxiuzi.cn/bianma/zifuji.php
李子
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.使用转换函数将字符串编码转换为AL32UTF8
sql>从test.mdtsb中选择convert(op_user,'al32utf8','zhs16gbk')
UUID ='161A45E75BC88040E053441074848040';
convert(op_user,'al32utf8','zhs16gbk')
------------------------------------------------------------------------------------------
李金霍
这个结果验证了我们的猜测。此字符集应该是GBK类的角色集,但是由于GBK和GB18030,GB2312不是完整的父亲 - 藏的关系,所以这只能是其中之一。这只是GBK字符集更常用于当前的观点。
sql>从test.mdtsb中选择convert(op_user,'al32utf8','zhs16gbk')
UUID ='161A45E75BC88040E053441074848040';
convert(op_user,'al32utf8','zhs16cgb231280')
------------------------------------------------------------------------------------------
李金霍
sql>从test.mdtsb中选择convert(op_user,'al32utf8','zhs16gbk')
UUID ='161A45E75BC88040E053441074848040';
convert(op_user,'al32utf8','zhs32gb18030')
------------------------------------------------------------------------------------------
李金霍
6.检查与这三个中文字符相对应的UTF8的字符串编码
网站:http://www.qqxiuzi.cn/bianma/unicode-utf.php
李子
Unicode代码:0000674E
UTF8编码:E69D8E
UTF16代码:FEFF674E
UTF32编码:0000FEFF0000674E
场景
Unicode代码:0000666F
UTF8代码:E699AF
UTF16编码:FEFF666F
UTF32编码:0000FEFF000000666F
苍凉
Unicode代码:0000660A
UTF8代码:E6988A
UTF16代码:FEFF660A
UTF32编码:0000FEFF0000660A
因此,如果原始字符串编码是UTF8,则从理论上讲,我们通过转储函数获得的字符串编码应为:E6,9D,8E,E69,AF,E68,8A
通过转换函数转换相反功能:
sql>选择转储(convert(op_user,'al32utf8','zhs16gbk'),1016),test.mdtsb
其中uuid ='161A45E75BC88040E053441074848040';
转储(convert(op_user,'al32utf8','zhs16gbk'),1016)
------------------------------------------------------------------------------------------
typ = 1 len = 9Characterset = al32utf8:e6,9d,8e,e6,99,af,e68,8a
此结果验证了我们以前的查询结果。UTF8字符集的编码应为:
E6,9D,8E,E6,99,AF,E6,98,8A。
综上所述:
Oracle数据库中存储的列的实际编码是GBK类的字符集,因为客户端环境的字符编码是相同的,因此可以显示。实际上,存储的字符集应为UTF8。因此,标记的编码与实际的编码包裹不一致。
回复:
通过在数据同步任务的相应列上测试字符集获得的真实字符集,并使用转换函数(op_user,'al32utf8','zhs16gbk')进行转换。
例如:从matdoc中选择转换(key1,'zhs16gbk','utf8');
[MaxCompute;工具:dataworks]
从maxCompute.mdtsb中选择op_user,其中uuid ='161A45E75BC880404040441074804040';
实际上,MaxCompute中有相关的功能来分析和转换字符代码,但是我们只能在MaxCompute.-8上存储一个字符集“ UTF-8”。以下两个函数是MaxCompute的字符编码相关功能。
·编码
命令格式
二进制编码(字符串,字符串)
命令说明
Str以Charset格式编码。
参数说明
str:必须-fill.string type.String要重新编码。
charset:必须填充。String类型。编码格式。值范围为:UTF-8,UTF-16,UTF-16LE,UTF-16BE,ISO-8859-1,US-ASCII。
返回值描述
返回到二进制类型。当任何输入参数为null时,返回结果为null。
模范
示例1:字符串ABC以UTF-8格式编码。命令示例如下。
选择Encode(“ ABC”,“ UTF-8”);
-ABC。
·is_encoding
命令格式
boolean is_encoding(字符串,字符串,字符串)
命令说明
确定是否可以将输入字符串str从_encoding从指定的字符集转换为另一个字符集to_encoding。通常,您可以将from_encoding设置为UTF-8,然后将to_encododing设置为GBK。
参数说明
str:必须-fill.string类型。可以将空字符串视为属于任何字符集。
from_encoding,to_encoding:必须填充。弦类型,源和目标字符集。
返回值描述
返回到布尔类型。如果可以成功地转换str,返回true,否则返回false。如果任何输入参数为null,则返回null。
模范
示例1:确定角色测试或测试是否可以从UTF-8字符集转换为GBK字符集。命令如下。
选择is_encoding('test','utf-8','gbk');
- 真实。
选择is_encoding('test','utf-8','gbk');
- 真实。
转换功能
目的
将字符串从一个字符集转换为任何。
目的地和源贡献集参数都可以是包含章程名称的颜色或颜色。
定义为字符集定义的一部分。
例子
选择convert('?êíííííia b c d e','us7ascii','we8iso88859p1')
来自双重;
convert('?íóóóabcde'
-----------------------------------
a e i ??A B C D E?
['us7ascii'是当前Oracle数据库的字符集,'WE8ISO8859P1'是转换的字符集]
共同的字符集包括:
·us7ascii:US 7位ASCII角色集
·WE8DEC:西欧8位角色集
·F7DEC:DEC法语7位角色集
·WE8EBCDIC500:IBM西欧EBCDIC代码第500页
·WE8ISO8859P1:ISO 8859-1西欧8位角色集
·UTF8:Unicode 4.0 UTF-8通用字符集,CESU-8符合符合性
·AL32UTF8:Unicode 4.0 UTF-8通用字符集
资料来源:阿里巴巴云。