Oracle字符集與ORA-00972
作為普通的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的報錯,如果意識不到這個問題,在做資料庫備份恢復的時候就會導致災難性後果:不設定字符集變數或不一致可以備份、但是匯入的時候將無法匯入或匯入後出現中文亂碼,關於備份恢復與字符集以後再說!
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- oracle國家字符集與資料庫字符集Oracle資料庫
- oracle 字符集檢視與修改Oracle
- Oracle 全球化特性與字符集Oracle
- Oracle字符集Oracle
- Oracle 字符集Oracle
- linux 字符集和oracle 字符集LinuxOracle
- Oracle字符集和國家字符集Oracle
- Oracle 字符集修改Oracle
- 修改oracle字符集Oracle
- oracle修改字符集Oracle
- oracle字符集修改Oracle
- oracle 修改字符集Oracle
- ORACLE字符集(zt)Oracle
- oracle更改字符集Oracle
- 搞懂oracle字符集Oracle
- oracle 字符集 (轉)Oracle
- Oracle字符集超集與子集關係10GOracle
- 【字符集】論Oracle字符集“轉碼”過程Oracle
- Oracle字符集介紹Oracle
- Oracle 字符集小結Oracle
- 理解ORACLE 字符集【轉】Oracle
- oracle之修改字符集Oracle
- oracle字符集問題Oracle
- oracle中字符集列表Oracle
- ORACLE字符集簡介Oracle
- Oracle字符集的檢視查詢和Oracle字符集的設定修改Oracle
- oracle字符集相關整理Oracle
- Oracle修改資料字符集Oracle
- 修改oracle client 的字符集Oracleclient
- oracle字符集的更改【轉】Oracle
- 摘--檢視oracle 字符集Oracle
- 轉_oracle的字符集_源於多位元組字符集Oracle
- 【轉載】Oracle字符集子集與超級的對應關係Oracle
- Mysql字符集與字元序MySql字元
- mysql字符集與亂碼MySql
- sybase字符集與排序操作排序
- 修改Oracle資料庫字符集Oracle資料庫
- ORACLE字符集基礎知識Oracle