学无止境
分类: Oracle
2014-01-22 09:10:33
Oracle中存储特殊字符,需要该字符在字符集中有编码才可以正确存储,例如:
SQL> select ascii('☆') from dual;
ASCII('☆')
-----------
41454
SQL> select ascii('㊣') from dual;
ASCII('㊣')
-----------
43337
有一些特殊字符,如R圈,C圈符号,在ZHS16GBK中没有,但是在AL32UTF8字符集中,有C圈和R圈的符号,例如:
SQL> insert into tab1 select 1,UNISTR('\00A9') from dual;
1 row inserted
SQL> select * from tab1;
ID NAME
---------- --------------------
1 © <- 此处应该为C圈符号
SQL> insert into tab1 select 1,UNISTR('\00AE') from dual;
1 row inserted
SQL> select * from tab1;
ID NAME
---------- --------------------
1 ? <- 此处应该为R圈符号
查看ASCII编码或unicode编码的符号内容:
select rownum+40000,chr(rownum+40000) from dual connect by level<=10000;
select rownum,UNISTR('\00'||lpad(trim(to_char(rownum,'xx')),2,'0')) from dual connect by level<=255;
在ZHS16GBK下,通过UNISTR('\00ae')虽然也可以查出R圈,但是insert到表中就成了问号,在AL32UTF8字符集下是可以insert到表中并正确存储的。
SQL> insert into tab1 select 1,UNISTR('\00ae') from dual;
1 row inserted
SQL> select * from tab1;
ID NAME
---------- --------------------------------------------------
1 ?
select 1,chr(49838) from dual;
在AL32UTF8字符集下该assci是R圈。
1 CHR(49838)
---------- ----------
1 ? <- 此处应该为R圈符号
在ZHS16GBK字符集下是中文"庐"
1 CHR(49838)
---------- ----------
1 庐