Oracle 生僻字乱码问题

就一般情况来说,Oracle存储中英文的字段用varchar2类型就可以了,但有些时候,遇到生僻字就不行了。

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

1.查看当前使用的字符集 。
    select userenv('language') from dual;

 

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

2.建立测试表。


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

3.插入测试数据。


显而易见,这两种类型都行不通了。然而,我们可以换一下插入方法

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

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

然后,从dual中查询结果:

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

 

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

 

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

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

 

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

4.最后一点。
虽然说这个问题一般在很小的项目下不会经常遇到,但是还是有它存在的意义的。说不定哪一天你录入数据的时候,姓名会带有生僻字,然后惊奇发现数据变成 ? 了,然后,百度谷歌一找,各有各的说法,各有各的方案,然而...实用的?凉凉。作为过来人我觉得我有必要总结一下这个干货吧,希望能帮到有需要的人,欢迎转载,记得带上原文链接就好。

至于有人说通过更改数据库的字符集也可以实现,可以啊,但是这个代价和工作量过分点了吧?万一出现什么差池,后果太美不敢想象。除非在立项初期,考虑十分周到,囊括所有编码的问题,但是,这个,也有点玄。

感谢一下:Oracle 生僻字乱码解决方案_ITPUB博客

                  Oracle nvchar2和varchar2区别分析 - 张雨田 - 博客园

Oracle中处理生僻字有几种方法。首先,可以将需要存储生僻字的字段类型修改为nvarchar2,而不是varchar2。然后,可以通过数据库图形化工具手动将生僻字转换后插入该字段。最后,进入业务系统页面查看,生僻字应该能正常显示。\[1\] 另一种方法是将生僻字转为Unicode编码,然后使用utl_raw.cast_to_varchar2函数查询结果。这种方式可以在varchar2字段中正确存储生僻字。\[2\] 需要注意的是,在Oracle中,实际上只有nvarchar2字段才能正确存储生僻字。因此,如果需要存储多个生僻字,可以将其分解处理,并使用utl_raw.cast_to_nvarchar2函数进行插入。\[3\] #### 引用[.reference_title] - *1* [解决Oracle存储生僻字oracle生僻字oracle偏僻字、数据库生僻字数据库偏僻字](https://blog.csdn.net/qq_29062045/article/details/123865076)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [oracle生僻字解决方案](https://blog.csdn.net/qq_41793064/article/details/93721735)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值