Преобразование из одной кодировки в другую
Функция
Преобразование символьной (байтовой) строки в соответствие с заданной кодовой страницей.
Спецификация
::=
::=
::=
::=
Синтаксические правила
-
Тип данных
< значимого выражения >
< строки >
должен бытьCHAR
,VARCHAR
,NCHAR
,NVARCHAR
,BYTE
,VARBYTE
. -
< Выходная кодировка >
и< входная кодировка >
– символьные литералы, задающие имена кодовых страниц. Не допускается использование параметров, выражений и имен столбцов. -
Если
< входная кодировка >
не задана, используется значение по умолчанию: текущая кодировка< строки >
(обычно совпадает с кодировкой канала) для значений строковых типов и кодировка системного словаря – для значений байтовых типов. -
Если
< выходная кодировка >
и< входная кодировка >
не заданы, то перекодировка выполняется из кодировки системного словаря СУБД в кодировку канала.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|
-
Доступны все кодировки, включенные в системную таблицу $$$CHARSET и дополнительно Unicode-кодировки с именами UTF-8 и UCS2.
-
Аргумент
< строка >
может быть задан< SQL-параметром >
, который должен содержать спецификацию типа данных параметра.select convert(? (char(20)), 'CP866', 'CP1251'); яЁштхЄ |привет |
Общие правила
-
При посылке данных клиентскому приложению перекодированная строка автоматически преобразуется в кодировку клиентского приложения, поэтому запрос, извлекающий результат работы функции
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'); |привет|привет|привет|привет|привет|
-
Если требуется получить строку в кодировке, отличной от кодировки клиента, следует воспользоваться приведением к байтовому типу:
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|*|
Т.е. несмотря на то, что все извлекаемые значения имеют одно и то же строковое представление, бинарное представление у них разное.
Возвращаемое значение
-
Если
< выходная кодировка >
не является Unicode-кодировкой, функция возвращает строку типаVARCHAR
. -
Если
< выходная кодировка >
является Unicode-кодировкой, функция возвращает строку типаNVARCHAR
.
Примеры
Примечание
Примеры выполнены с помощью утилиты inl в среде ОС Windows с кодировкой клиента CP866.
Структура-описатель значения < строки > содержит информацию о кодировке.
-
select convert('яЁштхЄ', 'CP1251', 'CP1251'), convert('привет', 'CP1251', 'CP866'), convert('╨╥╔╫┼╘', 'CP1251', 'KOI8-R'), convert(cast Hex('3F0440043804320435044204') as nchar, 'CP1251', 'UCS2'), convert(Hex('EFF0E8E2E5F2'), 'CP1251', 'CP1251'); |привет|привет|╨╥╔╫┼╘|привет|привет|
-
select convert('a'||'b', 'CP1251', 'UCS2'); |?|