将NCLOB转换为Unicode/HEX/BASE64
我的Oracle 12c数据库字符集是WE8ISO8859P1 我有一个列为NCLOB的表,并希望提取3种不同编码的数据 BASE64 十六进制 统一码 我试着写一些函数,输出是正确的,但是为什么在编码字符串中出现新行呢 请在下面查找该函数的详细信息将NCLOB转换为Unicode/HEX/BASE64,unicode,character-encoding,base64,hex,oracle12c,Unicode,Character Encoding,Base64,Hex,Oracle12c,我的Oracle 12c数据库字符集是WE8ISO8859P1 我有一个列为NCLOB的表,并希望提取3种不同编码的数据 BASE64 十六进制 统一码 我试着写一些函数,输出是正确的,但是为什么在编码字符串中出现新行呢 请在下面查找该函数的详细信息 WITH FUNCTION EncodeBASE64(InClearChar IN CLOB) RETURN CLOB IS dest_lob BLOB; lang_context INTEGER :=
WITH
FUNCTION EncodeBASE64(InClearChar IN CLOB) RETURN CLOB IS
dest_lob BLOB;
lang_context INTEGER := DBMS_LOB.DEFAULT_LANG_CTX;
dest_offset INTEGER := 1;
src_offset INTEGER := 1;
read_offset INTEGER := 1;
warning INTEGER;
ClobLen INTEGER := DBMS_LOB.GETLENGTH(InClearChar);
amount INTEGER := 1440; -- must be a whole multiple of 3
-- size of a whole multiple of 48 is beneficial to get NEW_LINE after each 64 characters
buffer RAW(1440);
res CLOB := EMPTY_CLOB();
BEGIN
IF InClearChar IS NULL OR NVL(ClobLen, 0) = 0 THEN
RETURN NULL;
ELSIF ClobLen <= 24000 THEN
RETURN UTL_RAW.CAST_TO_VARCHAR2(UTL_ENCODE.BASE64_ENCODE(UTL_RAW.CAST_TO_RAW(InClearChar)));
END IF;
-- UTL_ENCODE.BASE64_ENCODE is limited to 32k/(3/4), process in chunks if bigger
DBMS_LOB.CREATETEMPORARY(dest_lob, TRUE);
DBMS_LOB.CONVERTTOBLOB(dest_lob, InClearChar, DBMS_LOB.LOBMAXSIZE, dest_offset, src_offset,
DBMS_LOB.DEFAULT_CSID, lang_context, warning);
LOOP
EXIT WHEN read_offset >= dest_offset;
DBMS_LOB.READ(dest_lob, amount, read_offset, buffer);
res := res || UTL_RAW.CAST_TO_VARCHAR2(UTL_ENCODE.BASE64_ENCODE(buffer));
read_offset := read_offset + amount;
END LOOP;
DBMS_LOB.FREETEMPORARY(dest_lob);
RETURN res;
END EncodeBASE64;
FUNCTION castToHex(InClearChar IN NCLOB) RETURN CLOB IS
dest_lob BLOB;
lang_context INTEGER := DBMS_LOB.DEFAULT_LANG_CTX;
dest_offset INTEGER := 1;
src_offset INTEGER := 1;
read_offset INTEGER := 1;
warning INTEGER;
ClobLen INTEGER := DBMS_LOB.GETLENGTH(InClearChar);
amount INTEGER := 1440; -- must be a whole multiple of 3
-- size of a whole multiple of 48 is beneficial to get NEW_LINE after each 64 characters
buffer RAW(1440);
res CLOB := EMPTY_CLOB();
BEGIN
IF InClearChar IS NULL OR NVL(ClobLen, 0) = 0 THEN
RETURN NULL;
ELSIF ClobLen <= 24000 THEN
RETURN RAWTOHEX(UTL_RAW.CAST_TO_RAW(InClearChar));
END IF;
-- UTL_ENCODE.BASE64_ENCODE is limited to 32k/(3/4), process in chunks if bigger
DBMS_LOB.CREATETEMPORARY(dest_lob, TRUE);
DBMS_LOB.CONVERTTOBLOB(dest_lob, InClearChar, DBMS_LOB.LOBMAXSIZE, dest_offset, src_offset,
DBMS_LOB.DEFAULT_CSID, lang_context, warning);
LOOP
EXIT WHEN read_offset >= dest_offset;
DBMS_LOB.READ(dest_lob, amount, read_offset, buffer);
res := res || RAWTOHEX(buffer);
read_offset := read_offset + amount;
END LOOP;
DBMS_LOB.FREETEMPORARY(dest_lob);
RETURN res;
END castToHex;
SELECT EncodeBASE64('uživaÄ Ê Í Õ Ø A B C D Etele, kteří temp in the town A B C D Etele, kteří') as encodedBASE64
from dual;
输出
encodedBASE64->dcW+aXZhw4Qgw4ogw40gw5Ugw5ggQSBCIEMgRCBFdGVsZSwga3RlxZnDrSB0ZW1w
IGluIHRoZSB0b3duICBBIEIgQyBEIEV0ZWxlLCBrdGXFmcOt
问题1-当我使用此encodedBASE64 online转换为字符串时,它正确返回文本,但为什么即使我删除新行输出,编码字符串中仍存在新行
问题2-如何将此字符串转换为unicode格式,请帮助ISO-8859-1 Latin-1/西欧中未定义字符Ź、ž、ř,但ISO-8859-2 Latin-2/东欧中未定义字符。不幸的是,对于像Õ这样的字符,Ø是有效的反关系。请改用。@JosefZ这在我使用SQLPLUS时有效,可能是windows NLS设置不正确,现在的问题是,当我从表列中提取数据时,它给了我不正确的数据。请回答问题并在您的数据库中共享不正确的数据。@JosefZ已完成,已更新