故障诊断之表中中文出现乱码

场景:业务反馈表中中文出现乱码,进入数据库查看,确实数据库存储内容为乱码。查看服务器操作系统字符集、数据库的字符集和本地软件的字符集均为utf8,后发现操作系统环境变量只设置LANG=en_US.UTF-8,未设置NLS_LANG=AMERICAN_AMERICA.AL32UTF8 。修改环境变量后,重新执行,中文正常显示。

 

 

 

1.操作系统环境变量、oracle的客户端

vi /home/oracle/19.8
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8

操作系统环境变量针对语言项设置有几个,我经常设置的是这两个LANG和NLS_LANG。
LANG是针对Linux系统的语言、地区、字符集的设置,对linux下的应用程序有效,如date。
NLS_LANG是针对Oracle语言、地区、字符集的设置,对oracle中的工具有效。

 

2.oracle的数据库

set linesize 200 pagesize 300
 col PARAMETER for a30
 col VALUE for a60
 select * from   nls_database_parameters;
 
 PARAMETER                      VALUE
------------------------------ ------------------------------------------------------------
NLS_RDBMS_VERSION              19.0.0.0.0
NLS_NCHAR_CONV_EXCP            FALSE
NLS_LENGTH_SEMANTICS           BYTE
NLS_COMP                       BINARY
NLS_DUAL_CURRENCY              $
NLS_TIMESTAMP_TZ_FORMAT        DD-MON-RR HH.MI.SSXFF AM TZR
NLS_TIME_TZ_FORMAT             HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_FORMAT           DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_FORMAT                HH.MI.SSXFF AM
NLS_SORT                       BINARY
NLS_DATE_LANGUAGE              AMERICAN
NLS_DATE_FORMAT                DD-MON-RR
NLS_CALENDAR                   GREGORIAN
NLS_NUMERIC_CHARACTERS         .,
NLS_NCHAR_CHARACTERSET         AL16UTF16
NLS_CHARACTERSET               AL32UTF8
NLS_ISO_CURRENCY               AMERICA
NLS_CURRENCY                   $
NLS_TERRITORY                  AMERICA
NLS_LANGUAGE                   AMERICAN

20 rows selected.

NLS_LANGUAGE 表示“语言”
NLS_TERRITORY 表示“地域”
NLS_CHARACTERSET 表示“字符集”
所以“AMERICAN_AMERICA.ZHS16GBK”就是将他们三个按照“语言_地域.字符集”的格式拼接起来

 

3.查看当前字符集

select userenv('language') from dual;
USERENV('LANGUAGE')
----------------------------------------------------
AMERICAN_AMERICA.AL32UTF8

总结

NLS_LANG保证和客户端的字符集是一样的,就不会出现乱码。
出现乱码有两种情况,一种存储了错误的编码,一种存储了正确的编码,显示了错误的字符。

还有本地软件的字符集,如crt的字符集。

 

1.修改用户名是需要修改隐含参数的。
2.当删除的用户有在登录的时候,是无法删除的。
3.comment可以重复定义,新的会覆盖旧的,无需删除旧的。

posted @ 2021-11-04 14:18  AnneZhou  阅读(138)  评论(0)    收藏  举报