2020-01-08 Oracle 数据库储存生僻字

在运维过程中发现了生僻字的存储和传输。生僻字的主要来源是人员姓名,传输过程中定义了生僻字的单独的特殊传输方式,但是在存储时运维人员并不能很明确的明确字体是生僻字,现就生僻字存储的方式找到以下解决方案,以备后续使用。

案例描述:在默认字符集环境下,实现Oracle储存生僻字: 㛃、䶮.....(使用nvarchar2字段类型实现,以“”为代表进行测试)。

 

1.查看当前使用的字符集 。

    select userenv('language') from dual;

一般来说,在安装Oracle数据库的时候,字符集设置选择的是使用默认值,也就是 ZHS16GBK(字符集)

2.建立测试表。

create table TEST
(
SNAME VARCHAR2(50),
TNAME NVARCHAR2(50)
)

varchar2  跟 nvarchar2 区别不大,但是在存放中文的时候,nvarchar2会比varchar2多一点。

3.插入测试数据。

2020-01-08 Oracle 数据库储存生僻字_第1张图片

 

 

正常的插入方式测试,这两种类型都行不通了。然而,我们可以换一下插入方法。

首先,把生僻字转换为Unicode。在线转换链接http://www.bejson.com/convert/unicode_chinese/

"㛃" 转为Unicode为 "\u36c3"(注意: \u 是Unicode的转义字符,使用的时候要去掉)

然后,从dual中查询结果:

2020-01-08 Oracle 数据库储存生僻字_第2张图片

select utl_raw.cast_to_nvarchar2('36c3') from dual;

2020-01-08 Oracle 数据库储存生僻字_第3张图片

实质上,在nvarchar2才存储了“㛃”字。

最后,再一次进行插入数据:

2020-01-08 Oracle 数据库储存生僻字_第4张图片

 

insert  into  test(sname,Tname)  values((select utl_raw.cast_to_nvarchar2('36c3') from dual ),(select utl_raw.cast_to_nvarchar2('36c3') from dual));

commit;

 

2020-01-08 Oracle 数据库储存生僻字_第5张图片

 

nvarchar2类型的TNAME成功插入了生僻字“㛃”。

 

4.主要说明。

 

虽然说这个问题一般在很小的项目下不会经常遇到,但是还是有它存在的意义的。说不定录入数据的时候,姓名会带有生僻字,然后惊奇发现数据变成 ? 了,然后,百度谷歌一找,各有各的说法,各有各的方案,然而...实用的?凉凉。以上方式是代价最小的可行的方案,通过更改数据库的字符集也可以实现,但是这种方式工作量成本过高,出现差错的恢复难度太大,不建议使用(除非项目建立初期的规划考虑周到,囊括所有编码问题还会有风险。)

你可能感兴趣的:(2020-01-08 Oracle 数据库储存生僻字)