Проблема с кодировкой в XML в Oracle
Имеется БД Oracle 19c с кодировкой
PARAMETER | VALUE |
---|---|
NLS_NCHAR_CHARACTERSET | AL16UTF16 |
NLS_CHARACTERSET | AL32UTF8 |
Создаю XML средствами Orcle, соответственно в тегах присутствует кириллица. Я задаю кодировку UTF-8
SELECT xmlroot(xmlagg(xmlelement("MA",
xmlforest(1 "STATUS",
v.app_type "APP_TYPE",
v.fname "FNAME",
v.pname "PNAME",
v.lname "LNAME",
v.dob "DOB",
v.dob_od "DOB_OD",
v.pob "POB",
v.inc_tm "INC_TM",
v.gender "GENDER",
v.educ_lvl "EDUC_LVL",
v.marit_st "MARIT_ST",
v.kids "KIDS"))),
version '1.0" encoding="UTF-8') AS xml
FROM nh_data_vector v
WHERE v.id_nh = 1
При этом отображается XML корректно.
<?xml version="1.0" encoding="UTF-8"?>
<MA>
<STATUS>1</STATUS>
<APP_TYPE>4</APP_TYPE>
<FNAME>ДМИТРИЙ</FNAME>
<PNAME>ВЛАДИМИРОВИЧ</PNAME>
<LNAME>ЗИМИН</LNAME>
<DOB>1991-11-20</DOB>
<DOB_OD>1991-11-20</DOB_OD>
<POB>ГОР.САРАТОВ</POB>
<INC_TM>100000</INC_TM>
<GENDER>1</GENDER>
<EDUC_LVL>3</EDUC_LVL>
<MARIT_ST>1</MARIT_ST>
<KIDS>0</KIDS>
</MA>
Но при передаче сообщения в другую систему, начинает лететь кодировка. Как отправляю:
FUNCTION f_get_response
(
in_request IN CLOB
) RETURN CLOB IS
l_req utl_http.req;
l_res utl_http.resp;
l_url VARCHAR2(4000) := 'http://test_send_case_test';
l_buffer CLOB;
l_content CLOB;
l_response CLOB;
BEGIN
l_content := in_request;
l_req := utl_http.begin_request(url => l_url,
method => 'POST',
http_version => 'HTTP/1.1');
utl_http.set_header(l_req, 'user-agent', 'mozilla/4.0');
utl_http.set_body_charset(l_req, 'UTF-8');
utl_http.set_header(l_req, 'Transfer-Encoding', 'chunked');
utl_http.set_header(l_req, 'Content-Length', length(l_content));
utl_http.write_text(l_req, l_content);
l_res := utl_http.get_response(l_req);
BEGIN
LOOP
utl_http.read_line(l_res, l_buffer);
l_response := l_response || l_buffer;
END LOOP;
utl_http.end_response(l_res);
EXCEPTION
WHEN utl_http.end_of_body THEN
utl_http.end_response(l_res);
END;
RETURN(l_response);
END;
Решил проверить и запрос преобразовал в blob-объект задав ему кодировку UTF-8
SELECT r.id_nh,
r.request,
xmlserialize(content xmltype(r.request) AS BLOB encoding 'UTF-8')
FROM nh_request r
WHERE r.id_nh = 279
Собственно вид
<MA>
<STATUS>1</STATUS>
<APP_TYPE>4</APP_TYPE>
<FNAME>ДМРРўР РР™</FNAME>
<PNAME>ВЛАДРРњРР РћР’РР§</PNAME>
<LNAME>Р—РРњРРќ</LNAME>
<DOB>1991-11-20</DOB>
<DOB_OD>1991-11-20</DOB_OD>
<POB>ГОР.САРАТОВ</POB>
<INC_TM>100000</INC_TM>
<GENDER>1</GENDER>
<EDUC_LVL>3</EDUC_LVL>
<MARIT_ST>1</MARIT_ST>
<KIDS>0</KIDS>
</MA>
Из декодера понял что это кодировка Win-1251.
И если я меняю кодировку в blob на Windows-1251, то данные приходят в норму.
В связи с этим имею вопрос, как так происходит, что данные кодируются на БД в Windows-1251, хотя везде используется UTF-8? И как это лечить?
Источник: Stack Overflow на русском