快速解决linux上oracle安装乱码问题

时间:2023-02-10 10:10:23

问题:在Linux上安装Oracle时,由于oracle用户的local LANG设置问题,导致安装oracle软件时,安装界面上很多地方显示为乱码。

解决办法:在oracle用户下执行:export LC_ALL=en_US

再次安装oracle,所有窗口按钮就都可以显示为英文了。


下面是有关字符集的详细介绍。

建议oracle11g及更高版本的客户端和服务器安装使用al32utf8编码。

强烈要求os客户端、NLS_LANG、oracle数据库字符集都设置成统一的。

另外如果使用em,也要注意浏览器的字符集是否一致。

 

查看数据库字符集

数据库服务器端字符集可通过视图V$NLS_PARAMETERS中的NLS_CHARACTERSET的值查看。

本地设置环境变量NLS_LANG(我的电脑,右键,属性,高级,环境变量),如设置为SIMPLIFIED CHINESE_CHINA.ZHS16GBK。

数据库的字符集在安装时指定后,不可修改。如一定要修改字符集,那么建议重新建库。不过如果是升级超集,倒是可以的。

方法1:

SQL> select * from sys.props$where name = 'NLS_CHARACTERSET';

方法2:

SQL> select * fromV$NLS_PARAMETERS;

PARAMETER                                                   VALUE

NLS_DATE_LANGUAGE                                            AMERICAN

NLS_CHARACTERSET                                             ZHS16GBK

NLS_SORT                                                       BINARY

 

注意事项:在使用exp imp的时候,NLS_LANG参数的字符集设置一定要和oracle数据库的字符集一样,否则就会出现字符转换现象。就会导入数据时,报列的长度不够,导出时报 ORA-00091等问题。

 

NLS_LANG这个参数的设置的值,最低要求是要和客户端操作系统的字符集一样。因为oracle会自动转码的。但是为了防止客户端上的字符集在oracle服务端没有对应字符(比如客户端zhs16gbk,服务端al32utf8),造成转换失败,变为乱码,强烈推荐将客户端、NLS_LANG、oracle数据库字符集都设置成一样的。

这里的客户端指的是:

比如你用的是pl/sql登录的,那么客户端就是pl/sql,而NLS_LANG就是你在本机环境变量里设置的值。如果你要crt或者xshell登录的,那么客户端就是crt或者xshell,而NLS_LANG就是linux操作系统里的值,如果没有,就需要手动指定,所以,可以将其加入到.bash_profile里。

 

所以至于我们的环境变量NLS_LANG设置成exportNLS_LANG=AMERICAN_AMERICA.ZHS16GBK还是exportNLS_LANG=AMERICAN_AMERICA.AL32UTF8都无所谓,只要保证crt或者xshell的语言设置与其一样就行。

如果linux里当前会话设置成ZHS16GBK,那么crt和xshell语言选择默认

如果linux里当前会话设置成AL32UTF8,那么crt和xshell语言选择UTF-8

 

由此设置步骤可得知此设置不仅仅是针对PLSQL的,所有在客服机上连接ORACLE时显示的中文为?时都必须通过这个方法设置其字符集,使环境变量NLS_LANG与客户端上的一致方可正确显示中文内容。

 

检测字符集是否设置正确

先设置NLS_LANG环境变量

Linux临时设置当前会话export NLS_LANG=

Windows设置右键电脑设置或者临时设置set NLS_LANG=

$ sqlplus / as sysdba

SQL> insert into t1values (1,'中国');

SQL> select id,name,dump(name,1016) from t1;

       ID         NAME    DUMP(NAME,1016)

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

        1          中国       Typ=1 Len=4 CharacterSet=ZHS16GBK: d6,d0,b9,fa

dump(name,1016)是指将name这个列以16进制直接显示出来。所以八进制就是1008,十进制就是1010。前面的10就是将字符集也显示出来。

$ sqlplus / as sysdba

SQL> insert into t1values (1,'中国');

SQL> select id,name,dump(name,1016) from t1;

      ID    NAME     DUMP(NAME,1016)

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

      1     中国     Typ=1 Len=6 CharacterSet=AL32UTF8:e4,b8,ad,e5,9b,bd

 

如果exportNLS_LANG=AMERICAN_AMERICA.ZHS16GBK那么客户端字符集设置为Default

如果exportNLS_LANG=AMERICAN_AMERICA.AL32UTF8那么客户端字符集设置为UTF-8

 

常见的简体中文字符集都是US7ASCII的超集。

常见简体中文字符集

GB2312又称为ZHS16CGB231280   1981年5月实施   使用双字节编码 1995年12月实施 GBK字符集 是在GB2312-80标准基础上的内码扩展规范  使用双字节编码。

ZHS32GBK18030  2000年3月发布 向下兼容 GBK

ZHS16GBK   是ZHS32GBK18030的超集

Unicode是一个世界范围内大多数常用语言字符的编码方案。

UCS-2是一个16bit的Unicode编码,固定长度,每一个字符为2byte,主要用户java和Microsoftwindows。支持字符比较少

UTF-8(AL32UTF8)是一个8bit的Unicode编码,是变长编码,可能是1byte(字节)、2byte、3byte、4byte。UTF-8是HTML和网络浏览器使用最多的Unicode编码。

UTF-16(AL16UTF16)是一个16bitUnicode编码,是UCS-2的超集,完全兼容UCS-2,使用两个UCS-2码来表示扩充字符,一个字符在UTF-16里是2byte或者4byte。UTF-16主要用户Microsoft windows 2000。UTF-16编码字符只能用于数据库国家字符集。