关于操作系统的字符集,NLS_LANG,数据库字符集

时间:2022-09-02 06:44:49

在开发ORACLE数据库应用程序时,经常会碰到乱码的问题,也正是如此,我们不得不面对各种字符集间的设置和转换的问题。

为此我们必须搞清楚以下三种字符集的定义以及关系。

1〉操作系统的字符集,也可以理解为客户端字符集,我们通过以下方式察看。

1、打开CMD 命令行

开始->输入cmd 

关于操作系统的字符集,NLS_LANG,数据库字符集2、右击菜单栏进入属性

关于操作系统的字符集,NLS_LANG,数据库字符集

3、查找系统字符集

关于操作系统的字符集,NLS_LANG,数据库字符集

红色部分就是当前系统的字符集

*另外我们也可以通过命令行方式察看

〉chcp

>932 表示的是日文shift-jis,936是简体中文,437是英语。

2〉系统环境变量NLS_LANG,可以理解为ORACLE客户端的字符集设置。

注意:有可能系统根本就没有设置这个环境变量,这种情况下,我们可以通过注册表察看。

NLS_LANG的组成: NLS_LANG=<NLS_Language>_<NLS_Territory>.<客户端字符集>
例如: AMERICAN_AMERICA.WE8MSWIN1252

其中:
NLS_Language 指定:
- Oracle(错误)信息的语言
- 日和月份的名称

注意:NLS_LANGUAGE与插入和查询的*数据*的语言无关。

NLS_Territory 指定(国家或地区):
- 货币和数字格式
- 计算星期和天数的范围和惯例

客户端字符集(CLIENTS CHARACTERSET):
- 定义Oracle客户端,客户应用使用的编码
* 或者它要符合您Microsoft Windows代码页 (GUI工具的ACP, 命令提示符的CHCP 值)
* 或者为Unicode WIN32应用设置为UTF8/AL32UTF8

3〉数据库字符集,我们通过以下方法进行察看。

使用SQLPLUS username/password@servicename连接要察看的数据库,

执行select * from nls_database_parameters; 

NLS_LANGUAGE AMERICAN -〉语言
NLS_TERRITORY AMERICA
NLS_CURRENCY $
NLS_ISO_CURRENCY AMERICA
NLS_NUMERIC_CHARACTERS .,
NLS_CHARACTERSET JA16SJIS -〉数据库字符集
NLS_CALENDAR GREGORIAN
NLS_DATE_FORMAT Mon DD YYYY HH24:MI:SS
NLS_DATE_LANGUAGE AMERICAN
NLS_SORT BINARY
NLS_TIME_FORMAT AM
NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT TZR
NLS_TIMESTAMP_TZ_FORMAT HH.MI.SSXFF AM TZR
NLS_DUAL_CURRENCY $
NLS_COMP BINARY
NLS_LENGTH_SEMANTICS BYTE
NLS_NCHAR_CONV_EXCP FALSE
NLS_NCHAR_CHARACTERSET AL16UTF16 -〉可以理解为NCHAR, NVARCHAR2 and NCLOB 的定义
NLS_RDBMS_VERSION 11.2.0.4.0

当我们的程序中发生乱码时,很有可能就是我们这三处的设置出现了问题,因此首先确认这三处的各自设置的是什么值。

NLS_LANG与数据库字符集不一致时,我们的SQL文插入数据,或者查询时就有可能发生乱码。

当两者一致还是乱码时,很有可能就是我们的系统的字符集不支持NLS_LANG所设置的字符集。