Задать вопрос
@Exzyggwp

Как правильно конвертировать в UTF-8 внутри JSON_OBJECT?

Здравствуйте, делаю выборку данных в JSON_OBJECT (PL\SQL).
В строке
c_fullname' VALUE CONVERT(c.t_name, 'UTF8')
Полное имя клиента (c_fullname) = "Папов Вася Василевия"

DECLARE
  v_test varchar2(32767);
BEGIN        
	
        SELECT JSON_OBJECT(
               'c_cardnum' VALUE c.t_cardnum, 
               'c_fullname' VALUE CONVERT(c.t_name, 'UTF8'),
               'c_startdate' VALUE c.t_start_date,
               'c_enddate' VALUE c.t_end_date,
               'c_phonenum' VALUE c.t_phonenum
                   )           
          INTO v_test
          FROM clients c
         WHERE c.t_id = '10'; 

         dbms_output.put_line(v_test);  

END;

Если писать просто
'c_fullname' VALUE c.t_name),
без конверта то PL\SQL ругается что для JSON допустимо только UTF-8.

Если писать с помощью функции convert
'c_fullname' VALUE CONVERT(c.t_name, 'UTF8'),

В результате выходят какие то непонятные символы

"с_fullname":"¦ФTГTБ¦-¦-TВ¦-¦-¦- ¦Ь¦-TЕ¦-TГ¦-¦- ¦о¦-TГTБ¦-¦¬¦¬¦¦¦-¦-¦-"


Вопрос, Как можно правильно конвертировать поле fullname в UTF-8 чтобы при выводе через Varchar2 выводились правильные символы а не какие то крякорябры.. ?
  • Вопрос задан
  • 695 просмотров
Подписаться 1 Средний Комментировать
Решения вопроса 1
@Exzyggwp Автор вопроса
Поковырялся и всё равно не смог найти способ конвертации кириллицы на UTF-8 в PL\SQL.
Как вариант, сделал функцию транслита от кириллицы на латиницу, чтобы не выводились всякие символы.
Делюсь:
spoiler

DECLARE

v_str VARCHAR2(100) := 'Василий Пупкин';
v_res VARCHAR2(100) := '';

BEGIN
	  -- Строчные буквы
    FOR i IN 1..length( v_str ) LOOP 
		IF SUBSTR( v_str, i, 1 ) = 'а' THEN 
			v_res := v_res || 'a';
		ELSIF SUBSTR( v_str, i, 1 ) = 'б' THEN
      v_res := v_res || 'b';
		ELSIF SUBSTR( v_str, i, 1 ) = 'в' THEN
      v_res := v_res || 'v';
	  ELSIF SUBSTR( v_str, i, 1 ) = 'г' THEN
      v_res := v_res || 'g';
		ELSIF SUBSTR( v_str, i, 1 ) = 'д' THEN
      v_res := v_res || 'd';
		ELSIF SUBSTR( v_str, i, 1 ) = 'е' THEN
      v_res := v_res || 'e';
		ELSIF SUBSTR( v_str, i, 1 ) = 'ё' THEN
      v_res := v_res || 'yo';
		ELSIF SUBSTR( v_str, i, 1 ) = 'ж' THEN
      v_res := v_res || 'j';
		ELSIF SUBSTR( v_str, i, 1 ) = 'з' THEN
      v_res := v_res || 'z';
		ELSIF SUBSTR( v_str, i, 1 ) = 'и' THEN
      v_res := v_res || 'i';
    ELSIF SUBSTR( v_str, i, 1 ) = 'й' THEN
      v_res := v_res || 'y';
    ELSIF SUBSTR( v_str, i, 1 ) = 'к' THEN
      v_res := v_res || 'k';
    ELSIF SUBSTR( v_str, i, 1 ) = 'л' THEN
      v_res := v_res || 'l';
    ELSIF SUBSTR( v_str, i, 1 ) = 'м' THEN
      v_res := v_res || 'm';
    ELSIF SUBSTR( v_str, i, 1 ) = 'н' THEN
      v_res := v_res || 'n';
    ELSIF SUBSTR( v_str, i, 1 ) = 'о' THEN
      v_res := v_res || 'o';
    ELSIF SUBSTR( v_str, i, 1 ) = 'п' THEN
      v_res := v_res || 'p'; 
		ELSIF SUBSTR( v_str, i, 1 ) = 'р' THEN
      v_res := v_res || 'r';
    ELSIF SUBSTR( v_str, i, 1 ) = 'с' THEN
      v_res := v_res || 's';
    ELSIF SUBSTR( v_str, i, 1 ) = 'т' THEN
      v_res := v_res || 't';
    ELSIF SUBSTR( v_str, i, 1 ) = 'у' THEN
      v_res := v_res || 'u';
    ELSIF SUBSTR( v_str, i, 1 ) = 'ф' THEN
      v_res := v_res || 'f';
    ELSIF SUBSTR( v_str, i, 1 ) = 'х' THEN
      v_res := v_res || 'x';
    ELSIF SUBSTR( v_str, i, 1 ) = 'ц' THEN
      v_res := v_res || 'c';
    ELSIF SUBSTR( v_str, i, 1 ) = 'ш' THEN
      v_res := v_res || 'sh'; 
		ELSIF SUBSTR( v_str, i, 1 ) = 'щ' THEN
      v_res := v_res || 'sh';
    ELSIF SUBSTR( v_str, i, 1 ) = 'ъ' THEN
      v_res := v_res || '`';
    ELSIF SUBSTR( v_str, i, 1 ) = 'ы' THEN
      v_res := v_res || 'i';
    ELSIF SUBSTR( v_str, i, 1 ) = 'ь' THEN
      v_res := v_res || '`';
    ELSIF SUBSTR( v_str, i, 1 ) = 'э' THEN
      v_res := v_res || 'e';
    ELSIF SUBSTR( v_str, i, 1 ) = 'ю' THEN
      v_res := v_res || 'yu';
    ELSIF SUBSTR( v_str, i, 1 ) = 'я' THEN
      v_res := v_res || 'ya';
		-- Прописные буквы
		ELSIF SUBSTR( v_str, i, 1 ) = 'А' THEN 
      v_res := v_res || 'A';
    ELSIF SUBSTR( v_str, i, 1 ) = 'Б' THEN
      v_res := v_res || 'B';
    ELSIF SUBSTR( v_str, i, 1 ) = 'В' THEN
      v_res := v_res || 'V';
    ELSIF SUBSTR( v_str, i, 1 ) = 'Г' THEN
      v_res := v_res || 'G';
    ELSIF SUBSTR( v_str, i, 1 ) = 'Д' THEN
      v_res := v_res || 'D';
    ELSIF SUBSTR( v_str, i, 1 ) = 'Е' THEN
      v_res := v_res || 'E';
    ELSIF SUBSTR( v_str, i, 1 ) = 'Ё' THEN
      v_res := v_res || 'Yo';
    ELSIF SUBSTR( v_str, i, 1 ) = 'Ж' THEN
      v_res := v_res || 'J';
    ELSIF SUBSTR( v_str, i, 1 ) = 'З' THEN
      v_res := v_res || 'Z';
    ELSIF SUBSTR( v_str, i, 1 ) = 'И' THEN
      v_res := v_res || 'I';
    ELSIF SUBSTR( v_str, i, 1 ) = 'Й' THEN
      v_res := v_res || 'Y';
    ELSIF SUBSTR( v_str, i, 1 ) = 'К' THEN
      v_res := v_res || 'K';
    ELSIF SUBSTR( v_str, i, 1 ) = 'Л' THEN
      v_res := v_res || 'L';
    ELSIF SUBSTR( v_str, i, 1 ) = 'М' THEN
      v_res := v_res || 'M';
    ELSIF SUBSTR( v_str, i, 1 ) = 'Н' THEN
      v_res := v_res || 'N';
    ELSIF SUBSTR( v_str, i, 1 ) = 'О' THEN
      v_res := v_res || 'O';
    ELSIF SUBSTR( v_str, i, 1 ) = 'П' THEN
      v_res := v_res || 'P'; 
    ELSIF SUBSTR( v_str, i, 1 ) = 'Р' THEN
      v_res := v_res || 'R';
    ELSIF SUBSTR( v_str, i, 1 ) = 'С' THEN
      v_res := v_res || 'S';
    ELSIF SUBSTR( v_str, i, 1 ) = 'Т' THEN
      v_res := v_res || 'T';
    ELSIF SUBSTR( v_str, i, 1 ) = 'У' THEN
      v_res := v_res || 'U';
    ELSIF SUBSTR( v_str, i, 1 ) = 'Ф' THEN
      v_res := v_res || 'F';
    ELSIF SUBSTR( v_str, i, 1 ) = 'Х' THEN
      v_res := v_res || 'X';
    ELSIF SUBSTR( v_str, i, 1 ) = 'Ц' THEN
      v_res := v_res || 'C';
    ELSIF SUBSTR( v_str, i, 1 ) = 'Ш' THEN
      v_res := v_res || 'Sh'; 
    ELSIF SUBSTR( v_str, i, 1 ) = 'Щ' THEN
      v_res := v_res || 'Sh';
    ELSIF SUBSTR( v_str, i, 1 ) = 'Ъ' THEN
      v_res := v_res || '`';
    ELSIF SUBSTR( v_str, i, 1 ) = 'Ы' THEN
      v_res := v_res || 'I';
    ELSIF SUBSTR( v_str, i, 1 ) = 'Ь' THEN
      v_res := v_res || '`';
    ELSIF SUBSTR( v_str, i, 1 ) = 'Э' THEN
      v_res := v_res || 'E';
    ELSIF SUBSTR( v_str, i, 1 ) = 'Ю' THEN
      v_res := v_res || 'Yu';
    ELSIF SUBSTR( v_str, i, 1 ) = 'Я' THEN
      v_res := v_res || 'Ya';
		ELSE
			v_res := v_res || SUBSTR(v_str, i, 1);

		END IF;
    END LOOP;
		
		dbms_output.put_line(v_res);

END;


Можно даже использовать стандартную функцию TRANSLATE() от Pl\SQL , если вам нужно сделать трансляцию просто нескольких слов.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
Goodt Екатеринбург
от 100 000 до 150 000 ₽
Selecty Москва
До 350 000 ₽
Data World Москва
от 180 000 до 210 000 ₽