故障诊断之表中中文出现乱码
场景:业务反馈表中中文出现乱码,进入数据库查看,确实数据库存储内容为乱码。查看服务器操作系统字符集、数据库的字符集和本地软件的字符集均为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可以重复定义,新的会覆盖旧的,无需删除旧的。
Nothing is trivial at all;

浙公网安备 33010602011771号