oracle生僻字处理
(2018-03-14 15:30:43)分类: oracle |
网上摘,供本人学习,链接地址:https://note.youdao.com/share/?id=d2c7786f0609521887735ddc15bb89b1&type=note#/
背景:
今天遇到一个汉字生僻字在数据库中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类型中,则可正常存储到数据库中,
并正常显示。
前一篇:android打开模拟器报错
后一篇:检查汉字字符集编码的网站