在开发ORACLE数据库应用程序时,经常会碰到乱码的问题,也正是如此,我们不得不面对各种字符集间的设置和转换的问题。
为此我们必须搞清楚以下三种字符集的定义以及关系。
1〉操作系统的字符集,也可以理解为客户端字符集,我们通过以下方式察看。
1、打开CMD 命令行
开始->输入cmd
2、右击菜单栏进入属性
3、查找系统字符集
红色部分就是当前系统的字符集
*另外我们也可以通过命令行方式察看
〉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_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所设置的字符集。