Oracle資料庫字符集淺析

freshairpeng發表於2009-04-24

作者:IT168 譚懷遠  2009-04-07

【IT168技術文件】

  作為dba,在維護一個應用系統時,也許會遇到這樣的問題,使用者會抱怨在通過介面查詢資料庫中的資料時,顯示出來的卻是亂碼,於是懷疑儲存的資料成了亂碼。特別是資料庫中存放了簡,繁2種字型的字元時,更容易出現這種問題,本文主要討論資料庫在儲存簡,繁體字元時出現的各種問題。

  ? 什麼是資料庫字符集(database characterset)?

  資料庫字符集通常可以理解為資料庫提供的儲存某種語言字元的一種環境.舉個例子:英文,法文等文字每個字元佔一個位元組,而漢字一個字元需要2個位元組,這就要求資料庫提供相應的儲存環境來儲存這些字元.

  ? 字符集在資料庫中的應用。

  資料庫在建立時是需要指定字符集的,它決定了以後資料庫中所允許存放的語言字元,所以在系統設計當中,應當充分考慮資料庫中可能存放的語言文字。在我們周圍最常見的資料庫字符集的問題就是儲存,顯示簡體,繁體字元的問題.

  ? 和漢字相關的字符集

  目前存放漢字的資料庫最常用的兩種字符集是ZHS16CGB231280和ZHS16GBK .前者只包含了大約7000多個漢字,很多生僻字和繁體字都沒有包含進來.而ZHS16GBK是前者的一個擴充套件,大約包含了2.1萬個漢字字元,基本上包括了所有的繁體字和生僻字.而這兩種字符集又是大多數儲存中文資料庫中選用的字符集。

常見字元問題介紹

  ? 下面介紹的問題都是由於這著這兩種字符集的相容性產生的。

  ? 情況一 資料庫字符集為ZHS16GBK,客戶端字符集為:ZHS16GBK.

  這種情況下資料庫和客戶端的字符集完全一致,在插入和顯示簡,繁體字 符時都不會有問題。

  ? 情況二資料庫字符集為ZHS16GBK,客戶端字符集為ZHS16CGB231280

  由於客戶端的字符集是資料庫字符集的子集,,查詢時有些繁體字會顯示為亂碼,原因是客戶端的字符集中沒有包含當前顯示字元,其他的繁體字oracle會根據客戶端的字符集將他們穿換成簡體字後顯示出來。此時客戶端能否插入繁體字成功取決於所插入的繁體字是否包含在資料庫的字符集當中.

  情況三資料庫字符集為ZHS16CGB231280,客戶端為ZHS16CGB231280.

  可以顯示繁體字.插入繁體字時如果插入的繁體字包含在資料庫的字符集中就可以正常插入,否則報ORA-01756: 括號內的字串沒有正確結束,原因是oracle由於自身字符集中沒有包括該繁體字,所以將他作為單位元組處理,導致語法解析時出錯。

  ? 情況四資料庫字符集為ZHS16CGB231280,客戶端為ZHS16GBK.

  此時客戶端查詢時,很多的繁體字顯示為亂碼,簡體字可以正常顯示.可以插入 繁體字,但繁體字插入後,oracle會將它們全部轉換成簡體字.

  ? 結論

  從以上幾種情況可以看出:

  ? 出現亂碼的原因是資料庫,客戶端的字符集不一致造成,只要修改客戶端字符集就可以解決.客戶端如果是linux系統,修改使用者的環境變數中字符集的型別。如果是windows,直接修改登錄檔中oracle_home下的NLS_LANG的值。

  ? 對於需要同時儲存簡體中文和繁體中文時,應首先選擇ZHS16GBK,而不是ZHS16CGB231280,因為前者包含的字元是後者的3倍多.當然,現在的UNICODE字符集也可以選擇,它可以儲存各種語言字元.

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/14766526/viewspace-591702/,如需轉載,請註明出處,否則將追究法律責任。

相關文章