天天看點

linux亂碼和資料庫亂碼的問題簡單排查

在本地的虛拟機環境一直湊合着用英文,今天想看看中文的東西都顯示亂碼,下定決心要把問題解決了。

如果直接列印文本内容,通過putty也會顯示亂碼。

[ora11g@rac1 ~]$ cat aa.sh

δ? ε??ο?θ?ζ―δ?δ??ζ?θ―

[ora11g@rac1 ~]$

linux亂碼和資料庫亂碼的問題簡單排查

這個時候很可能是putty的編碼轉換的問題,通過檢視putty的設定,如上,可以看到應該選為utf-8。

選為UTF-8以後,重新列印,就沒有問題了。

你好,這是一個測試

第一個問題解決了,第二個問題又來了,來看看資料庫層面的亂碼問題。

[ora11g@rac1 ~]$ sqlplus n1/n1

SQL> select *from test;

        ID NAME

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

         1 ??????

 這個時候看看環境變量NLS_LANG的設定,如果為空,很可能會出問題。

[ora11g@rac1 ~]$ echo $NLS_LANG

簡單設定一下,這個最好和資料庫層面的字元集要一緻。

american_america.AL32UTF8

再來檢視一下,就沒有問題了。

         1 突破玩法界限

當然了,我的這個問題剛好資料庫層面是完全支援的,這樣就省去了很多額外的工作,如果資料庫層面的字元集不支援,那很可能就得重建庫來改變字元集了。

    select *from nls_database_parameters

SQL> /

PARAMETER                      VALUE

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

NLS_LANGUAGE                   AMERICAN

NLS_TERRITORY                  AMERICA

NLS_CURRENCY                   $

NLS_ISO_CURRENCY               AMERICA

NLS_NUMERIC_CHARACTERS         .,

NLS_CHARACTERSET               AL32UTF8

NLS_CALENDAR                   GREGORIAN

NLS_DATE_FORMAT                DD-MON-RR

NLS_DATE_LANGUAGE              AMERICAN

NLS_SORT                       BINARY

NLS_TIME_FORMAT                HH.MI.SSXFF AM

NLS_TIMESTAMP_FORMAT           DD-MON-RR HH.MI.SSXFF AM

NLS_TIME_TZ_FORMAT             HH.MI.SSXFF AM TZR

NLS_TIMESTAMP_TZ_FORMAT        DD-MON-RR HH.MI.SSXFF AM TZR

NLS_DUAL_CURRENCY              $

NLS_COMP                       BINARY

NLS_LENGTH_SEMANTICS           BYTE

NLS_NCHAR_CONV_EXCP            FALSE

NLS_NCHAR_CHARACTERSET         AL16UTF16

NLS_RDBMS_VERSION              11.2.0.3.0

另外系統層面的亂碼,網上檢視了一下,有些人建議修改/etc/sysconfig/i18n的設定。

[ora11g@rac1 ~]$ cat /etc/sysconfig/i18*

LANG="en_US.UTF-8"

SYSFONT="latarcyrheb-sun16"

如果修改為中文的,一定要注意設定的值,在我本地做測試,是不需要修改的,本身就支援,我修改的時候,竟然改錯了,結果重新登入及報了一大堆的錯誤,如下:

[ora11g@rac1 caipiao]$ su - ora11g

Password:

-bash: warning: setlocale: LC_CTYPE: cannot change locale (zn_CN.UTF-8): No such file or directory

-bash: warning: setlocale: LC_COLLATE: cannot change locale (zn_CN.UTF-8): No such file or directory

-bash: warning: setlocale: LC_MESSAGES: cannot change locale (zn_CN.UTF-8): No such file or directory

-bash: warning: setlocale: LC_NUMERIC: cannot change locale (zn_CN.UTF-8): No such file or directory

-bash: warning: setlocale: LC_TIME: cannot change locale (zn_CN.UTF-8): No such file or directory

如果修改,應該改為zh_CN,算是一個低級錯誤。