Преобразование из одной кодировки в другую

Функция

Преобразование символьной (байтовой) строки в соответствие с заданной кодовой страницей.

Спецификация
 
< выходная кодировка >::=
< входная кодировка >::=
Синтаксические правила
  1. Тип данных < значимого выражения > < строки > должен быть CHAR, VARCHAR, NCHAR, NVARCHAR, BYTE, VARBYTE.

  2. < Выходная кодировка > и < входная кодировка > – символьные литералы, задающие имена кодовых страниц. Не допускается использование параметров, выражений и имен столбцов.

  3. Если < входная кодировка > не задана, используется значение по умолчанию: текущая кодировка < строки > (обычно совпадает с кодировкой канала) для значений строковых типов и кодировка системного словаря – для значений байтовых типов.

  4. Если < выходная кодировка > и < входная кодировка > не заданы, то перекодировка выполняется из кодировки системного словаря СУБД в кодировку канала.

    create or replace table "ZZZТаблица с большим именемXXX" (i int, c char(10));
    create or replace public synonym s_tab_2 for "ZZZТаблица с большим именемXXX";
    insert into "ZZZТаблица с большим именемXXX" values (1,'DEFAULT');
    select * from "ZZZТаблица с большим именемXXX";
    select * from s_tab_2;
    
    Если теперь в командном интерфейсе выполнить команду
    show S_TAB_2
    то имя синонима будет показано как
    PUBLIC.SYNONIM FOR "SYSTEM"." ZZZ???????? ? ??????? ??????XXX"
    
    Чтобы получить корректное имя синонима, можно использовать функцию CONVERT:
    select convert(getraw($$$S14,30,66))
      from LINTER_SYSTEM_USER.$$$SYSRL
     where $$$S13 like 'S_TAB_2'
       and $$$S12 = -1;
    |ZZZТаблица с большим именемXXX|

  5. Доступны все кодировки, включенные в системную таблицу $$$CHARSET и дополнительно Unicode-кодировки с именами UTF-8 и UCS2.

  6. Аргумент < строка > может быть задан < SQL-параметром >, который должен содержать спецификацию типа данных параметра.

    select convert(? (char(20)), 'CP866', 'CP1251');
    яЁштхЄ
    |привет              |
Общие правила
  1. При посылке данных клиентскому приложению перекодированная строка автоматически преобразуется в кодировку клиентского приложения, поэтому запрос, извлекающий результат работы функции CONVERT, возвращает значения, перекодированные в кодировку клиентского приложения.

    select convert('яЁштхЄ', 'CP1251', 'CP1251'),
           convert('привет', 'CP1251', 'CP866'),
           convert('╨╥╔╫┼╘','CP1251','KOI8-R'),
           convert(cast Hex('3F0440043804320435044204') as nchar,'CP1251','UCS2'),
           convert(Hex('EFF0E8E2E5F2'),'CP1251','CP1251');
    
    |привет|привет|привет|привет|привет|
  2. Если требуется получить строку в кодировке, отличной от кодировки клиента, следует воспользоваться приведением к байтовому типу:

    select cast convert('привет', 'CP866', 'CP866') as byte,'*',
           cast convert('привет', 'CP1251', 'CP866') as byte,'*',
           cast convert('привет', 'KOI8-R', 'CP866') as byte,'*',
           cast convert('привет', 'UCS2', 'CP866') as byte,'*';
    
    | AF E0 A8 A2 A5 E2|*| EF F0 E8 E2 E5 F2|*| D0 D2 C9 D7 C5 D4|*| 3F 04 40 04 38 04 32 04 35 04 42 04|*|

    Т.е. несмотря на то, что все извлекаемые значения имеют одно и то же строковое представление, бинарное представление у них разное.

Возвращаемое значение
  1. Если < выходная кодировка > не является Unicode-кодировкой, функция возвращает строку типа VARCHAR.

  2. Если < выходная кодировка > является Unicode-кодировкой, функция возвращает строку типа NVARCHAR.

Примеры

Примечание

Примеры выполнены с помощью утилиты inl в среде ОС Windows с кодировкой клиента CP866.

Структура-описатель значения < строки > содержит информацию о кодировке.

  1. select convert('яЁштхЄ', 'CP1251', 'CP1251'),
           convert('привет', 'CP1251', 'CP866'),
           convert('╨╥╔╫┼╘', 'CP1251', 'KOI8-R'),
           convert(cast Hex('3F0440043804320435044204') as nchar, 'CP1251', 'UCS2'),
           convert(Hex('EFF0E8E2E5F2'), 'CP1251', 'CP1251');
    
    |привет|привет|╨╥╔╫┼╘|привет|привет|
  2. select convert('a'||'b', 'CP1251', 'UCS2');
    |?|