为了在 DM 上兼容 oracle 的 utl_i18n 包,提供功能上与 oracle 基本一致的 utl_i18n 包。UTL_I18N 包提供字符串与十六进制编码的相互转换功能。
UTL_I18N 依赖于 utl_raw。创建 UTL_I18N 之前,确保 utl_raw 已成功创建。
37.1 相关方法
下面对各个函数和过程进行详细说明。
- string_to_raw
将字符串转换成指定字符集下的十六进制串数值。
语法如下:
FUNCTION STRING_TO_RAW(
DATA IN VARCHAR,
TO_CHARSET IN VARCHAR DEFAULT NULL
) RETURN VARBINARY
参数详解
- DATA 输入参数,字符串。
- TO_CHARSET 输入参数,字符集。指定转换后的字符集。
返回值
转换后的十六进制串数值。字符集输错了,转换失败了,返回 null;单字节 0~255 用任何字符集编码都可以转成 ascii 值;三种字符集库(GBK 库、UTF8 库和韩文库)下都支持转换到 utf8 编码,只有 utf8 库支持转到字符集(GBK、BIG5、ISO_8859_9、EUC_JP、EUC_KR、KOI8R、GB18030、SQL_ASCII、ISO_8859_1)。字符串输入 null,返回当前字符集下的编码。
- raw_to_char
将从指定的字符集下的十六进制串数值转到字符串。
语法如下:
FUNCTION RAW_TO_CHAR(
DATA IN VARBINARY,
FROM_CHARSET IN VARCHAR DEFAULT NULL
) RETURN VARCHAR
参数详解
- DATA 输入参数, varbinary 数据。
- FROM_CHARSET 输入参数,字符集。转换前的字符集。
返回值
转换后的字符串。注意:字符集输错了,转换失败了,返回 null;ascii 值用任何字符集编码都可以转成单字节;只有 utf8 库支持指定字符集(GBK、BIG5、ISO_8859_9、EUC_JP、EUC_KR、KOI8R、GB18030、SQL_ASCII、ISO_8859_1)。十六进制串输入 null,返回在当前字符集下的字符串。
37.2 举例说明
使用包内的过程和函数之前,如果还未创建过系统包。请先调用系统过程
SP_CREATE_SYSTEM_PACKAGES(1)创建系统包
SP_CREATE_SYSTEM_PACKAGES(1,'UTL_RAW');
SP_CREATE_SYSTEM_PACKAGES(1,'UTL_I18N');
例 1 string_to_raw 函数的使用。
一 将 GBK 库中,GBK 编码的字符串转换成指定字符集下的十六进制串数值。
SQL> select utl_i18n.string_to_raw('中国','utf8') from dual;
查询结果如下:
0xE4B8ADE59BBD
SQL> select utl_i18n.string_to_raw('中国','GBK') from dual;
查询结果如下:
0xD6D0B9FA
SQL> select utl_i18n.string_to_raw('abcdef','utf8') from dual;
查询结果如下:
0x616263646566
SQL> select utl_i18n.string_to_raw('abcdef','GBK') from dual;
查询结果如下:
0x616263646566
二 UTF8 库中,将 UTF8 编码的字符串转换成指定字符集下的十六进制串数值。
SQL> select utl_i18n.string_to_raw('備註','BIG5');
查询结果如下:
0xB3C6B5F9
三 韩文库中,将韩文编码的字符串转换成指定字符集下的十六进制串数值。
SQL>select utl_i18n.string_to_raw(' 철수','EUC_KR') from dual;
查询结果如下:
0x20C3B6BCF6
例 2 raw_to_char 函数的使用。
一 从指定字符集下的十六进制串数值转为 GBK 编码(例如,本机为 GBK 库)字符串。
select UTL_I18N.RAW_TO_CHAR('61', 'utf8') from dual;
查询结果如下:
a
select UTL_I18N.RAW_TO_CHAR('E4B8ADE59BBD', 'UTF8') from dual;
查询结果如下:
中国
select UTL_I18N.RAW_TO_CHAR('D6D0B9FA', 'GBK') from dual;
查询结果如下:
中国
SQL> select UTL_I18N.RAW_TO_CHAR('616263', 'GBK') from dual;
查询结果如下:
abc
select UTL_I18N.RAW_TO_CHAR('616263', 'UTF8') from dual;
查询结果如下:
abc
二 从指定字符集下的十六进制串数值转为 UTF8 编码(例如,本机为 UTF8 库)字符串。
select UTL_I18N.RAW_TO_CHAR(utl_i18n.string_to_raw('備註','BIG5'),'BIG5') from dual;
查询结果如下:
備註
三 从指定字符集下的十六进制串数值转为韩文编码(例如,本机为韩文库)字符串。
select UTL_I18N.RAW_TO_CHAR(0x20C3B6BCF6,'EUC_KR') from dual;
查询结果如下:
철수