- 查看oracle数据库的编码集
字符集要求一致,但是语言设置却可以不同,语言设置建议用英文。如字符集是zhs16gbk,则nls_lang可以是American_America.zhs16gbk。
--------------------
VALUE
--------------------
NLS_CHARACTERSET
AL32UTF8
select * from nls_session_parameters,其来源于v$nls_parameters,表示会话自己的设置,可能是会话的环境变量或者是alter session完成,如果会话没有特殊的设置,将与nls_instance_parameters一致。
PARAMETER
--------------------
VALUE
--------------------
NLS_LANGUAGE
SIMPLIFIED CHINESE
A、oracle server 端 字符集查询
select userenv('language') from dual
其中NLS_CHARACTERSET 为server端字符集
NLS_LANGUAGE 为 server端字符显示形式
B、查询oracle client端的字符集
$echo $NLS_LANG
如果发现你select 出来的数据是乱码,请把client端的字符集配置成与linux操作系统相同的字符集。如果还是有乱码,则有可能是数据库中的数据存在问题,或者是oracle服务端的配置存在问题。
C、server端字符集修改
*****************************************************************
* 更改字符集步骤方法(WE8ISO8859P1 --> ZHS16GBK) *
*****************************************************************
1.首先以sysdba的身份登录上去 conn /as sysdba
2.关闭数据库shutdown immediate;
3.以mount打来数据库,startup mount
4.设置session
将数据库启动到RESTRICTED模式下做字符集更改:
SQL> conn /as sysdba
--sysdba的身份登录上去 conn /as sysdba
SQL> shutdown immediate;
SQL> startup mount
SQL> ALTER SYSTEM ENABLE RESTRICTED SESSION;
SQL> ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
SQL> ALTER SYSTEM SET AQ_TM_PROCESSES=0;
SQL> alter database open; --启动数据库
SQL> ALTER DATABASE CHARACTER SET ZHS16GBK; --修改字符集
ERROR at line 1:
ORA-12712: new character set must be a superset of old character set
这会可能会报错,提示我们的字符集:新字符集必须为旧字符集的超集,这时我们可以跳过超集的检查做更改:
ALTER DATABASE character set INTERNAL_USE ZHS16GBK;
这条语句就可以了,TERNAL_USE提供的帮助就会使oracle绕过了子集与超集的验证,这条语句和上面的语句内部操作时完全相同的。
SQL>shutdown immediate; -- 关闭,重新启动
SQL> startup
SQL> select * from v$nls_parameters;
client端字符集修改
在 /home/oracle与 /root用户目录下的.bash_profile中
添加或修改 export NLS_LANG="AMERICAN_AMERICA.UTF8" 语句
PS:当然字符集最好不要轻易修改,因为这会对数据库的数据有直接的影响,如果是生产环境的话,可能会造成不可估计得损失。
下面提供三种解决方法:
(1) 服务器端重新安装ORACLE
这种情况仅仅使用于空库和具有同一种字符集的数据。
(2)强行修改服务器端ORACLE当前字符集
在用imp命令加载数据前,先在客户端用sql*plus登录system DBA用户,执行下列SQL语句进行当前ORACLE数据库字符集修改:
SQL > create database character set US7ASCII
* create database character set US7ASCII
ERROR at line 1:
ORA-01031: insufficient privileges
你会发现语句执行过程中,出现上述错误提示信息,此时不用理会,实际上
ORACLE数据库的字符集已被强行修改为US7ASCII,接着用imp命令装载数据。等数
据装载完成以后,shutdown 数据库,再startup 数据库,用合法用户登录ORACLE
数据库,在sql>命令提示符下,运行select * from V$NLS_PARAMETERS,可以看
到ORACLE数据库字符集已复原,这时再查看有汉字字符数据的表时,汉字已能被正
确显示。
(3)利用数据格式转储,避开字符集限制
这种方法主要用于加载外来ORACLE数据库的不同字符集数据。其方法如下:
先将数据加载到具有相同字符集的服务器上,然后用转换工具卸出为
foxbase 格式或access格式数据库,再用转换工具转入到不同字符集的ORACLE数
据库中,这样就避免了ORACLE字符集的困扰。目前数据库格式转换的工具很多,象
power builder5.0以上版本提供的pipeline,Microsoft Access数据库提供的数
据导入/导出功能 等。转换方法参见有关资料说明。