营业部门送来的客户数据(CSV格式)里出现了乱码。 “三沢株式会社”。从上下文看,这大概是一个日文汉字。正是:驴槽上出了马嘴。
从格式看,这是HTML NUMBER格式。大概是用户通过WEB页面输入,因为浏览器对这种格式可自动转换,显示时并不出现乱码,但是保存后会出现。
我的ORACLE用的是UNICODE,相信没有显示不了的字符。
Oracle提供了一个UNISTR的函数,它要求输入4位16进制格式。当字符的UNICODE codepoint过大时,要先做切分,再说了,HTML NMBER是10进制,还要先转换到16进制。
好在xmlquery中可以用codepoints-to-string这样的函数。(http://www.sqlsnippets.com/en/topic-13438.html)
1. 自定义函数
create function code_to_char(dec_code in number)
return varchar2
is
chr_str varchar2(256);
sql_str varchar2(3200);
begin
sql_str := 'select xmlquery(''fn:codepoints-to-string('||dec_code||')'' returning content ).getstringval() from dual';
EXECUTE IMMEDIATE sql_str into chr_str ;
return chr_str;
end;
2. 验证
select code_to_char('沢') C from dual;
C |
---|
沢 |
可见, “三沢株式会社”应该是“三沢株式会社”。
select code_to_char(35) Digit2, code_to_char(245) Digit3, code_to_char(26576) Digit4, code_to_char(34003) Digit5, code_to_char(169808) Digit6 from dual;
DIGIT2 | DIGIT3 | DIGIT4 | DIGIT5 | DIGIT6 |
# | õ | 某 | 蓓 | * |
* 这个字的UNICODE信息可参见:http://en.glyphwiki.org/wiki/u29750
3. 利用此函数转换相应的字符
(详情略。使用单一的Udapte+replace怕不成。也许要用PL/SQL,还要用循环)