问题描述
我喜欢将大量的文本数据从db导出到文件。
db中的字符集是utf8。
文件中的例外结果是ISO8859P2或mswin1250。
我的数据库设置:
在服务器目录 (linux) 中创建的文件。我没有更多关于linux字符集设置的信息。
PLSQL代码:
以db (六进制) 为单位的原始值:
4373 6572 6520 4C61 6A6F 736E E9
Cs er e La jo sn é
记事本中的结果 (在UTF8中编码):
Csere Lajosn
Csere Lajosn
Csere Lajosn
Csere Lajosn
Csere lajoss é
Csere Lajosn
记事本中的结果 (encode in ANSI,char set: windows-1250):
Csere Lajosn
Csere Lajosn
Csere Lajosn
Csere Lajosn
Csere lajoss ă©
Csere Lajosn
记事本中的结果 (在ANSI中编码,char set: iso-8859-2):
Csere Lajosn
Csere Lajosn
Csere Lajosn
Csere Lajosn
Csere lajoss ă š
Csere Lajosn
当我使用CONVERT时,我失去了 “é” 字符。
如何将字符串从UTF8转换为ANSI?
谢谢,
佐尔坦
db中的字符集是utf8。
文件中的例外结果是ISO8859P2或mswin1250。
我的数据库设置:
SELECT * FROM v$nls_parameters;
1 NLS_LANGUAGE HUNGARIAN 0
2 NLS_TERRITORY HUNGARY 0
9 NLS_CHARACTERSET UTF8 0
10 NLS_SORT HUNGARIAN 0
16 NLS_NCHAR_CHARACTERSET UTF8 0
17 NLS_COMP BINARY 0
18 NLS_LENGTH_SEMANTICS CHAR 0
19 NLS_NCHAR_CONV_EXCP FALSE 0
select * from nls_database_parameters;
1 NLS_RDBMS_VERSION 12.1.0.2.0
2 NLS_NCHAR_CONV_EXCP FALSE
15 NLS_NCHAR_CHARACTERSET UTF8
16 NLS_CHARACTERSET UTF8
19 NLS_TERRITORY AMERICA
20 NLS_LANGUAGE AMERICAN
select * from nls_session_parameters;
1 NLS_LANGUAGE HUNGARIAN
2 NLS_TERRITORY HUNGARY
9 NLS_SORT HUNGARIAN
15 NLS_COMP BINARY
16 NLS_LENGTH_SEMANTICS CHAR
17 NLS_NCHAR_CONV_EXCP FALSE在服务器目录 (linux) 中创建的文件。我没有更多关于linux字符集设置的信息。
PLSQL代码:
DECLARE
v_fh UTL_FILE.FILE_TYPE;
v_eol VARCHAR2(2);
v_eollen PLS_INTEGER;
CURSOR cur_sql IS
SELECT T3.ID_RESULT
,T3.column1
FROM table1
WHERE id_result = 999999
;
"ID_RESULT" DBMS_SQL.NUMBER_TABLE;
"column1" DBMS_SQL.VARCHAR2A;
BEGIN
EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_DATE_FORMAT = ''YYYY.MM.DD HH24:MI:SS''';
v_eol := CHR(13)||CHR(10);
v_eollen := LENGTH(v_eol);
v_fh := UTL_FILE.FOPEN('REP_DIR','result_test.csv','W', 32000);
OPEN cur_sql;
LOOP
FETCH cur_sql
BULK COLLECT INTO "ID_RESULT",
"column1",
LIMIT 1000;
IF "ID_RESULT".COUNT > 0 THEN
FOR i IN "ID_RESULT".FIRST .. "ID_RESULT".LAST LOOP
UTL_FILE.PUT(v_fh, CONVERT("column1"(i),'EE8ISO8859P2','UTF8'));
UTL_FILE.PUT_nchar(v_fh, v_eol);
UTL_FILE.PUT(v_fh, CONVERT("column1"(i),'EE8MSWIN1250','UTF8'));
UTL_FILE.PUT(v_fh, v_eol);
UTL_FILE.PUT(v_fh, CONVERT("column1"(i),'EE8ISO8859P2'));
UTL_FILE.PUT(v_fh, v_eol);
UTL_FILE.PUT(v_fh, CONVERT("column1"(i),'EE8MSWIN1250'));
UTL_FILE.PUT(v_fh, v_eol);
UTL_FILE.PUT(v_fh, "column1"(i));
UTL_FILE.PUT(v_fh, v_eol);
UTL_FILE.PUT(v_fh, utl_raw.cast_to_varchar2(utl_raw.convert(utl_raw.cast_to_raw("column1"(i) ),'HUNGARIAN_HUNGARY.EE8MSWIN1250', 'ENGLISH_UNITED KINGDOM.UTF8')));
UTL_FILE.PUT(v_fh, v_eol);
UTL_FILE.fflush(v_fh);
END LOOP;
END IF;
EXIT WHEN cur_sql%NOTFOUND;
END LOOP;
CLOSE cur_sql;
UTL_FILE.FCLOSE(v_fh);
EXCEPTION
WHEN
.........
RAISE;
END;以db (六进制) 为单位的原始值:
4373 6572 6520 4C61 6A6F 736E E9
Cs er e La jo sn é
记事本中的结果 (在UTF8中编码):
Csere Lajosn
Csere Lajosn
Csere Lajosn
Csere Lajosn
Csere lajoss é
Csere Lajosn
记事本中的结果 (encode in ANSI,char set: windows-1250):
Csere Lajosn
Csere Lajosn
Csere Lajosn
Csere Lajosn
Csere lajoss ă©
Csere Lajosn
记事本中的结果 (在ANSI中编码,char set: iso-8859-2):
Csere Lajosn
Csere Lajosn
Csere Lajosn
Csere Lajosn
Csere lajoss ă š
Csere Lajosn
当我使用CONVERT时,我失去了 “é” 字符。
如何将字符串从UTF8转换为ANSI?
谢谢,
佐尔坦
专家解答
当Oracle支持部门建议时,除特定字符集修复任务外,切勿将CONVERT函数用于任何其他任务。
要以数据库字符集以外的编码生成文件,请以写字节模式 ('wb') 打开文件。然后,使用UTL_I18N.STRING_TO_RAW将您的文本转换为所需的字符集,使其同时为RAW值。然后,使用UTL_FILE.PUT_RAW编写原始值。
我建议定义一个本地过程来进行转换和写入,以简化多个写入请求的编码。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




