ITPub博客

首页 > 数据库 > Oracle > 数据库存储生僻字存在的问题

数据库存储生僻字存在的问题

原创 Oracle 作者:skyin_1603 时间:2017-03-07 00:02:12 0 删除 编辑

    最近遇到两个比较棘手的事情,都是同一种状况:数据库储存不了带有生僻字的客户名。
一个是“?”,另外一个是“?”,只能是感叹汉语真是博大精深啊。SR向原厂的工程师援助,
原厂都没有办法提供很好的解决方案。以下是遇到这种状况的数据库的字符集情况。当输入带有
这两个生僻字的记录时候,数据能录入,但是当查询记录结果的时候,对应字段的信息就变成乱码
“?”。经过非生僻字的储存测试,以下涉及到的两种字符集完全可以存储汉字的数据记录,但就是不能
存储汉字中比较生僻的字。后面根据朋友做的一些测试说,在生僻字的前后价格空格可以插入到数据库,并
能成功的显示出来。我按照朋友介绍的方法在我的测试环境中再少补充了一些测试,结果还是只能插入而不显示。
原厂对朋友的这种测试,也还没有作任何有效的回复。
连改博文保存发表之后,两个生僻字都显示为乱码(估计博客后台数据库也识别不了),我只能用以下图片展示以下两个生僻字了:
----两个生僻字(拼音分别为“jie”二声 和“mian”二声):


----
背景数据库的字符集:

SQL>select userenv('language') from dual;

USERENV('LANGUAGE')

----------------------------------------------------

AMERICAN_AMERICA.ZHS16GBK

 

---数据库主机的字符集:

AMERICAN_AMERICA.ZHS16GBK

 

----生僻文字输入并存储测试:


--生僻字1:?

--生僻字2:?

---测试表:suxing用户下的表yourtest:

suxing@PROD>select * from yourtest;

 

        ID NAME   CREATED   SEX

---------- ------ --------- -----

       125 susu   02-NOV-16 man

       123 yyyy   02-NOV-16 man

       124 hhhh   10-NOV-16 man

       126 wwww   10-NOV-16 man

       125 dddd   11-NOV-16 woman

       123 yyyy   24-NOV-16 man

       127 haha   06-DEC-16 man

 

---测试库的字符集:

scott@PROD>select userenv('language') from dual;

 

USERENV('LANGUAGE')

----------------------------------------------------

AMERICAN_AMERICA.AL32UTF8

 

---在CRT客户端尝试插入一条数据(name值为“??”):


suxing@PROD>insert into yourtest values(128,'??','','woman');


1 row created.

suxing@PROD>commit;

Commit complete.

#成功插入。

 

---在CRT客户端查询结果:

suxing@PROD>select * from yourtest where id=128;

        ID NAME   CREATED   SEX

---------- ------ --------- -----

       128 ??               Woman

#不显示出中文,乱码。

 

---在Windows环境的plsql developer客户端查看:


#结果显示也是乱码。

 

---在Windows cmd查看:



SQL> select * from suxing.yourtest where id=128;

        ID NAME         CREATED        SEX

---------- ------------ -------------- ----------

       128 ??                          Woman

#结果显示同样是乱码。

 

---尝试在Windows cmd往测试表中插入一条新记录:

SQL> insert into suxing.yourtest values(129,'??',sysdate,'woman');

已创建 1 行。

SQL> commit;

提交完成。
 

---在Windows cmd查看新增的记录:

SQL> select * from suxing.yourtest where id=129;

        ID NAME         CREATED        SEX

---------- ------------ -------------- ----------

       129 ??           06-3月 -17     woman

#从结果看,依然是乱码。

 

---在Windows环境的plsql developer客户端查看新增记录:

select * from suxing.yourtest where id=129;


#也还是乱码。

 

---CRT客户端连接服务端查看新增记录:

suxing@PROD>select * from yourtest where id=129;

        ID NAME   CREATED   SEX

---------- ------ --------- -----

       129 ??     06-MAR-17 woman

#结果乱码。

 

---在Windows cmd进行非生僻字尝试插入一条记录:

insert into suxing.yourtest values(130,'苏醒',sysdate,'man');

SQL> insert into suxing.yourtest values(130,'苏醒',sysdate,'man');

已创建 1 行。

SQL> commit;

提交完成。

 

---查看新增记录:

SQL> select * from suxing.yourtest where id=130;

        ID NAME         CREATED        SEX

---------- ------------ -------------- ----------

       130 苏醒         06-3月 -17     man

 

---在plsql developer客户端查看新增记录:

select * from suxing.yourtest where id=130;


---在CRT客户端查看:

suxing@PROD>select * from yourtest where id=130;

        ID NAME   CREATED   SEX

---------- ------ --------- -----

       130 ??     06-MAR-17 man

#当ID为130时,CRT客户端的查询结果是乱码。

 

 

---在plsql developer客户端尝试插入一条新记录:

insert into suxing.yourtest values(131,'??',sysdate,'man');

commit;


---在plsql developer客户端查看输出结果:

select * from suxing.yourtest where id=131;


#结果显示是乱码。


---在Windows cmd查看最新增加的两条记录:

SQL> select * from suxing.yourtest where id=131;

        ID NAME         CREATED        SEX

---------- ------------ -------------- ----------

       131 ??           06-3月 -17     man

       131 ??           06-3月 -17     man



#最新两条记录的查询结果也是乱码。


 

---在Windows cmd再插入一条带生僻字记录:

SQL> insert into suxing.yourtest values(131,'??',sysdate,'man');

已创建 1 行。

SQL> commit ;

#成功插入一条记录。

 

SQL> select * from suxing.yourtest where id=131;

        ID NAME         CREATED        SEX

---------- ------------ -------------- ----------

       131 ??           06-3月 -17     man

 

---在Windows cmd查看带生僻字“??”的新增记录:

SQL> select * from suxing.yourtest where id=131;

        ID NAME         CREATED        SEX

---------- ------------ -------------- ----------

       131 ??           06-3月 -17     man


--------附加测试(在生僻字前后加上空格):

---设置主机系统字符集环境:

[oracle@enmo ~]$ export NLS_LANG=AMERICAN_AMERICA.AL32UTF8

 

--查看表的结构,字段name的数据类型与长度:

PROD>desc suxing.yourtest

 Name                                      Null?    Type

 ----------------------------------------- -------- ----------------------------

 ID                                                 NUMBER(3)

 NAME                                               VARCHAR2(6)

 CREATED                                            DATE

 SEX                                                VARCHAR2(5)

 

---尝试在生僻字前后加空格的字符串:

SQL> insert into suxing.yourtest values(131,' ?? ',sysdate,'man');

已创建 1 行。

SQL> commit;

提交完成。

 

---查看新插入的记录:

SQL> select * from suxing.yourtest where id=131;

 

        ID NAME         CREATED        SEX

---------- ------------ -------------- ----------

       131 ??           06-3月 -17     man

       131  ??          06-3月 -17     man

#查询结果依然显示乱码。




来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31392094/viewspace-2134807/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2016-09-06

  • 博文量
    231
  • 访问量
    215104