作为普通的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的报错,如果意识不到这个问题,在做数据库备份恢复的时候就会导致灾难性后果:不设置字符集变量或不一致可以备份、但是导入的时候将无法导入或导入后出现中文乱码,关于备份恢复与字符集以后再说!