資料庫儲存生僻字存在的問題

skyin_1603發表於2017-03-07

    最近遇到兩個比較棘手的事情,都是同一種狀況:資料庫儲存不了帶有生僻字的客戶名。
一個是“?,另外一個是“?”,只能是感嘆漢語真是博大精深啊。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

#ID130時,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部落格 ” ,連結:http://blog.itpub.net/31392094/viewspace-2134807/,如需轉載,請註明出處,否則將追究法律責任。

相關文章