暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

非unicode字符集遇到生僻中文

godba 2022-01-13
3133
上边蓝字关注我们

1.常用的中文字符集收录汉字数情况:
  • GB2312 收录了7445个字符,包括6763个汉字和682个其它符号;

  • GBK 收录了21886个符号,包括21003个汉字和883个其它符号;--当前最常用字符集

  • GB18030-2000 收录了27533个汉字;


2.我们到底有多少个汉字呢:

  • 1990年出版的《辞海》收录了14872个汉字。

  • 1716年编撰的《康熙字典》收录了47035个汉字。

  • 1994年出版的《中华辞海》收录了87019个汉字(其中重复字320个)

  • 现今,北京国安咨询设备公司汉字字库收入有出处汉字91251个...


3.官方建议及字符集转换工具

     所以,想要正常录入这些生僻字,oracle官方建议建库时使用AL32UTF8字符集。

  或者目前在11.2和12c上,当需要从ZHS16GBK字符集转换为AL32UTF8时,官方建议使用DMU工具进行转换工作,该工具可以帮助客户对当前数据库内容进行检查和解决字符集转换过程中出现数据问题。

      具体实现方法请参考MOS文档 The Database Migration Assistant for Unicode (DMU) Tool (Doc ID 1272374.1)。


4.那么,在不变字符集的情况下,录入这些生僻字怎么办?

  • 使用支持Unicode的客户端

    SQL Developer,PL/SQL Developer,JDBC也可以支持(JDBC客户端需要设置其属性oracle.jdbc.convertNcharLiterals =TRUE)

  • 必须修改一个客户端参数 ORA_NCHAR_LITERAL_REPLACE=TRUE

    默认情况下,对于insert语句,Oracle首先使用数据库字符集(比如ZHS16GBK)对其中的数值进行转换,而该汉字不在GBK字符集中,这样就可致了乱码。通过设置参数ORA_NCHAR_LITERAL_REPLACE=TRUE,可以让Oracle不进行字符的转换。

  • 使用NLS_NCHAR_CHARACTERSET(国家字符集)的AL16UTF16来存储具有生僻字的数据,即使用nvarchar2数据类型(而不是varchar2数据类型)。

  • 在操作nvarchar2数据类型时,使用n‘data’的格式。


5.测试

--数据库服务器端:

 select * from nls_database_parameters where parameter in ('NLS_CHARACTERSET', 'NLS_NCHAR_CHARACTERSET');


--数据库客户端:
select userenv('language') from dual;

--客户操作系统端:

echo $NLS_LANG--unix,linux
echo %NLS_LANG%--windows,修改系统环境变量或者注册表信息

--创建测试表

create table test(name varchar2(32),name_special nvarchar2(32));
insert into test values('䶮䫻',n'䶮䫻');
select * from test;

在linux系统下,设置两个环境变量后问题解决

--设置前

ZHYU@ora11> create table test(name varchar2(32),name_special nvarchar2(32));
Table created.
ZHYU@ora11> insert into test values('䶮䫻',n'䶮䫻');
1 row created.


ZHYU@ora11> select * from test;
NAME NAME_SPECIAL
-------------------------------- --------------------------------
?????? ??????

--设置后

[oracle@vm1 ~]$ export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
[oracle@vm1 ~]$ export ORA_NCHAR_LITERAL_REPLACE=TRUE
ZHYU@ora11> create table test(name varchar2(32),name_special nvarchar2(32));
Table created.


ZHYU@ora11> insert into test values('䶮䫻',n'䶮䫻');
1 row created.


ZHYU@ora11> select * from test;
NAME NAME_SPECIAL
-------------------------------- ----------------------------------------------------------------
䶮䫻                             䶮䫻


windows环境下pl/sql developer配置,要添加系统环境变量,如下图所示时








文章转载自godba,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论