PostgreSQL Oracle 兼容性之 - 字符编码转换 CONVERT

1 minute read

背景

参考
https://docs.oracle.com/cd/B28359_01/server.111/b28286/functions027.htm

Oracle 中,可以将一个字符串从一个编码转换为另一个编码的输出。

convert(string, 目标字符集, 源字符集)

例如

SELECT CONVERT('Ä Ê Í Õ Ø A B C D E ', 'US7ASCII', 'WE8ISO8859P1') 
   FROM DUAL; 

CONVERT('ÄÊÍÕØABCDE' 
--------------------- 
A E I ? ? A B C D E ? 

PostgreSQL 字符集转换方法

postgresql支持的转换函数如下

                              List of functions
   Schema   |     Name     | Result data type | Argument data types |  Type  
------------+--------------+------------------+---------------------+--------
 pg_catalog | convert      | bytea            | bytea, name, name   | normal
 pg_catalog | convert_from | text             | bytea, name         | normal
 pg_catalog | convert_to   | bytea            | text, name          | normal
(3 rows)

PostgreSQL支持的转换映射关系如下

postgres=# select * from pg_conversion ;
            conname             | connamespace | conowner | conforencoding | contoencoding |            conproc             | condefault 
--------------------------------+--------------+----------+----------------+---------------+--------------------------------+------------
 ascii_to_mic                   |           11 |       10 |              0 |             7 | ascii_to_mic                   | t
 mic_to_ascii                   |           11 |       10 |              7 |             0 | mic_to_ascii                   | t
 koi8_r_to_mic                  |           11 |       10 |             22 |             7 | koi8r_to_mic                   | t
 ...
 utf8_to_shift_jis_2004         |           11 |       10 |              6 |            41 | utf8_to_shift_jis_2004         | t
 euc_jis_2004_to_shift_jis_2004 |           11 |       10 |              5 |            41 | euc_jis_2004_to_shift_jis_2004 | t
 shift_jis_2004_to_euc_jis_2004 |           11 |       10 |             41 |             5 | shift_jis_2004_to_euc_jis_2004 | t
(132 rows)

使用convert_from, convert_to或者直接使用convert即可完成Oracle convert的功能。

例如

select convert('abc中国'::bytea, 'UTF8', 'GBK');

postgres=# select 'abc中国'::bytea;
        bytea         
----------------------
 \x616263e4b8ade59bbd
(1 row)

postgres=# select convert('abc中国'::bytea, 'UTF8', 'GBK');
     convert      
------------------
 \x616263d6d0b9fa
(1 row)

Flag Counter

digoal’s 大量PostgreSQL文章入口