Oracle字符集與ORA-00972

清風艾艾發表於2015-01-30
    作為普通的Oracle資料庫使用者或使用者,使用sqlplus 執行正常的sql查詢遇到下面報錯時,
SQL> /
select spec_id "分公司編號" from test3 where org_id='測試01'
               *
ERROR at line 1:
ORA-00972: identifier is too long

    第一反應是上網查閱報錯原因及處理方法,然而從網上看到最多的是sql語句查詢的識別符號過長,建議你修改識別符號長度。在oracle伺服器上使用oerr ora 0972得到如下結果:
[oracle@oracleasm ~]$ oerr ora 0972
00972, 00000, "identifier is too long"
// *Cause:  An identifier with more than 30 characters was specified.
// *Action:  Specify at most 30 characters.
[oracle@oracleasm ~]$
    從上述英文解釋理解,也是識別符號過長,建議修改識別符號的長度。但是,導致ORA-0972的報錯真的是識別符號過長導致的嗎?答案是:不一定!
    以我當前的測試環境:
    作業系統
[oracle@oracleasm ~]$ uname -a
Linux oracleasm 2.6.18-194.el5 #1 SMP Tue Mar 16 21:52:39 EDT 2010 x86_64 x86_64 x86_64 GNU/Linux
[oracle@oracleasm ~]$ 
    資料庫版本
SQL> select * from v$version;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bi
PL/SQL Release 10.2.0.1.0 - Production
CORE 10.2.0.1.0 Production
TNS for Linux: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production
SQL> 
    再看那個查詢語句的識別符號“分公司編號”字元長度有30個嗎?個人覺得遠不到30個字元,如果你真的修改了識別符號長度,雖然sql語句能執行了,但是你很可能什麼結果也查不到。原因如下:
SQL> select spec_id "編號" from test3 where org_id='測試01';
no rows selected
SQL> l
  1* select spec_id "緙栧彿" from test3 where org_id='嫻嬭瘯01';
    看到這個sql語句,就知道為什麼剛才漢字為5個的時候就報超過30個字元長度,縮短識別符號後查不到結果的原因了,資料庫伺服器字符集、sqlplus客戶端字符集、xshell字符集不一致導致的。
    資料庫字符集
SQL> select userenv('language') from dual;
USERENV('LANGUAGE')
----------------------------------------------------
AMERICAN_AMERICA.UTF8
    sqlplus 客戶端字符集
[oracle@oracleasm ~]$ echo $NLS_LANG

[oracle@oracleasm ~]$ 
    xshell軟體字符集

    其實,不是sqlplus客戶端環境沒有設定字符集環境變數,有些資料庫比較敏感,伺服器根本就不配置,這是今天在中國開發投資有限公司SQL調優時遇到的。
    既然,知道具體的報錯原因,接下來就好辦了。
    查詢資料庫伺服器端的字符集
SQL> select userenv('language') from dual;
USERENV('LANGUAGE')
----------------------------------------------------
AMERICAN_AMERICA.UTF8
    設定sqlplus客戶端字符集與資料庫伺服器保持一致(注意有些unix伺服器與Linux設定環境變數的方法不一樣哦)
[oracle@oracleasm ~]$ export NLS_LANG=AMERICAN_AMERICA.UTF8
[oracle@oracleasm ~]$ echo $NLS_LANG
AMERICAN_AMERICA.UTF8
[oracle@oracleasm ~]$
    調整Xshell軟體的字符集與資料庫伺服器保持一致

    接下來再次執行執行ora-0972報錯的SQL語句

    不再報錯了吧,即使有5個漢字的識別符號也不會報ora-0972了。
    其實,字符集不一致不光會導致Ora-0972的報錯,如果意識不到這個問題,在做資料庫備份恢復的時候就會導致災難性後果:不設定字符集變數或不一致可以備份、但是匯入的時候將無法匯入或匯入後出現中文亂碼,關於備份恢復與字符集以後再說!

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

相關文章