oracle生僻字处理
背景:
今天遇到一个汉字生僻字在数据库中GBK字符集中无法正常编码存储。
分析:
具体描述:生僻字“𡚸”无法存储在数据库上。
收集数据及析:1. 这个“𡚸”能够使用的常用的输入吗?----不能,用了五笔,微软拼字,在windows 10简体中文的平台下,打不出这个字。
2. 数据库的本地字符集是zhs16gbk,国标字符集utf-8
3. 测试从网上找到“𡚸”字copy下来,并放在select '𡚸' from dual;执行,无法显示,只显示'??'
4. 在百度上找到这个字‘𡚸’描述他的unicode代码是216b8,并将此uniocde 码copy到word下,进行转码“alt+x”,发现能转码成功,正常显示出‘𡚸’
5. 使用该unicode编码放在select unistr('\216b8') from dual; 解码不正确,
6. 使用百度找了一个unicode转码的工具转出来是\ud845\udeb8,然后再试一次,这里推断u是转码标识符,在oracle中并不真正需要,改写如下:select unistr('\d845\deb8') from dual;正确显示。
7. 再进行一次祼数据转换测试,成功显示生僻字。
select utl_raw.cast_to_raw(unistr('\d845\deb8')) from dual;
select utl_raw.cast_to_nvarchar2('EDA185EDBAB8') from dual;
8. 再进行一次探索测试,使用将raw转为varchar2,无法显示:
select utl_raw.cast_to_varchar2('EDA185EDBAB8') from dual;
初步结论:该字符是能在nvarchar2下存储,在varchar2下不能存储。
第二轮分析:
具体描述:为什么同一个祼数据转换为字符时,nvarchar2能显示,varchar2不能显示?
收集数据:nvarchar2->utf8 varchar2-> zhs16gbsk
分析:推断这个生僻字使用utf-8应该能存储。
试验:select n'𡚸' from dual; <<<<<<<<<<<这里的N是指将这个字面义转换为national character set ,对应我的环境就是UTF-8了。
执行上面的语句测试,成功显示生僻字‘𡚸’
再进一步测试:
drop table hqq.qqt0528;
create table hqq.qqt0528 as
select n'𡚸' name from dual;
select * from hqq.qqt0528;
测试成功,'𡚸'成功存入数据库,使用desc hqq.qqt0528; 发现name是nvarchar2格式,与文档描述一致。
结论:
如果遇到生僻字,输入法无法输出,但在网上找到这个字及对应的unicode码后,就可以把这个字copy下来,或使用word的alt+x生成生僻字,再使用insert into t1 values(n'生僻字'); 方式存入nvarchar2类型中,则可正常存储到数据库中, 并正常显示。
参考文档: