首页 > 数据库 > Oracle > 数据库存储生僻字存在的问题
最近遇到两个比较棘手的事情,都是同一种状况:数据库储存不了带有生僻字的客户名。
一个是“?”,另外一个是“?”,只能是感叹汉语真是博大精深啊。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值为“??”):

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/ ,如需转载,请注明出处,否则将追究法律责任。