如何设置Oracle数据库客户端字符集以及系统中的NLS_LANG环境变量
概述:
本地化是系统或软件运行的语言和文化环境。设置NLS_LANG环境参数是规定Oracle数据库软件本地化行为最简单的方式。
NLS_LANG参数不但指定了客户端应用程序和Oracle数据库所使用的语言和地区;同时也指定了客户端程序输入数据和显示数据所使用的字符集。
本文主要包含如下五部分
◆
NLS_LANG环境变量的构成
◆ NLS_LANG环境变量的格式
◆
如何查看数据库NLS参数设置
◆ 举例说明如何设置NLS_LANG环境变量
◆
举例说明一些特殊情况
一,NLS_LANG环境变量的构成
NLS_LANG环境变量由如下三部分构成:
1,LANGUAGE:客户端系统所使用的语言。
指定Oracle数据库反馈的消息(例如异常信息,提示信息等)、字符数据的排列顺序(当指定ORDER BY时)、日(年月日中的天)名称,月名称等所使用的语言。
每个支持的语言都有唯一的名称。例如,若操作系统使用简体中文,则为SIMPLIFIED CHINESE;若操作系统使用美式英文操作系统,则为AMERICAN。
LANGUAGE参数中隐含地区和字符集参数的信息。如果没有指定LANGUAGE参数的值,则默认值为AMERICAN。
2,TERRITORY:客户端系统所在的地区。
指定默认的日期,货币以及数字格式。
每一个支持的地区都有唯一的名称。如,CHINA,AMERICA或CANADA。
如果没有指定TERRITORY参数,则此参数的值由LANGUAGE参数推理得出。
3,CHARSET:客户端应用程序所使用的字符集。
正确地设置NLS_LANG环境变量,则使得字符数据能够在客户端字符集和数据库字符集之间正确地转换。
设置NLS_LANG不会改变客户端系统的字符集,它仅仅是让Oracle数据库知道客户端应用程序使用的是什么字符集,从而进行相应的字符集转换。
如果客户端和数据库字符集相同,则Oracle数据库忽略字符集校验,不执行字符集转换。
Oracle所支持的每个字符集都有唯一的缩写。如,ZHS16GBK(GBK),AL32UTF8(UTF-8)等。
每一个LANGUAGE默认都有一个和它关联的字符集。
二,NLS_LANG环境变量的格式
NLS_LANG = LANGEAGE_TERRITORY.CHARSET
注意,此处的.为英文逗号。
三,如何查看数据库NLS参数设置
1,通过NLS_DATABASE_PARAMETERS视图查看数据库的NLS参数。
SELECT
* FROM NLS_DATABASE_PARAMETERS ORDER BY PARAMETER;
查询如下图所示。其中,NLS_CHARACTERSET参数的值就表示数据库所使用的字符集(创建数据库时所指定的字符集)。
2,通过NLS_SESSION_PARAMETERS视图查看当前用户会话的NLS参数。
SELECT * FROM NLS_SESSION_PARAMETERS ORDER
BY PARAMETER;
查询如下图所示:

四,举例说明如何设置NLS_LANG环境变量
此部分主要通过Oracle数据库自带的SQL PLUS数据库客户端程序说明如何设置NLS_LANG中的字符集。
实验环境:
数据库NLS参数设置:数据库NLS参数设置如第三部分(查看数据库NLS参数设置)中第一个图所示,NLS_CHARACTERSET=AL32UTF8。
操作系统:Windows
10英文企业版64位。
实验准备:
1,创建一个表CHINESE_DATA
CREATE TABLE CHINESE_DATA(
CH_DATA VARCHAR2(64)
);
实验一:
此实验举例说明如何正确地设置命令行窗口和系统的NLS_LANG环境变量,从而能够正确地显示查询结果。
1,设置客户端系统的NLS_LANG环境变量

如上图所示,Windows系统环NLS_LANG境变量的值为AMERICAN_AMERICA.ZHS16GBK,而数据库的字符集为AL32UTF8。
很显然,数据库字符集和客户端NLS_LANG中的字符集不一样。这就有可能导致客户端查询数据时出现乱码。
2,插入一条数据
INSERT INTO CHINESE_DATA VALUES('汉字');
COMMIT;
注意:插入数据时可以借助PL/SQL Developer等工具,以确保数据能正确地输入并存储到数据库中。
3,使用默认环境,在不改变命令行窗口代码页(每个代码页都对应着一个字符集)的情况下查询数据。
437代码页对应的字符集主要包含拉丁字母。
437代码页所包含的字符分类:


如上图所示,不出所料,查询结果出现乱码。
实验说明:
数据库字符集为AL32UTF8,Oracle通过NLS_LANG得知客户端字符集为ZHS16GBK。
Oracle在返回查询结果时,把数据转换为GBK格式,而437代码页所包含的字符中根本没有汉字字符,所以显示为乱码。
4,把命令行窗口的代码页改为65001,其对应的字符集为UTF-8。

如上图所示,查询结果为不可见字符,也属于乱码。
实验说明:
Oracle返回的数据为GBK字符集,而控制台为UTF-8字符集。尽管UTF-8字符集是GBK字符集的超集(其包含了所有GBK字符集中的字符),
但是两者对同一个字符的编码是不一样的。如图所示,GBK中“汉字”这两个字符所包含的字节(Bytes)在UTF-8字符集中都表示不可见字符。
所以,其显示结果是不正确的。
5,把控制台代码页设置为936,其对应的字符集为GB2312。
注意,由于本次实验的环境为英文系统,故而需要设置命令行窗口的字体。不然,无法正确显示中文字符。

如图所示,其查询结果是正确的。
实验说明:
尽管GBK字符集是GB2312字符集的超集,其比GB2312字符集包含更多的字符。
但是GBK字符集向前兼容GB2312字符集。“汉字”这两个字符在GBK和GB2312字符集中的编码完全相同,所以查询能够正确显示。
实验结论:
1,NLS_LANG环境变量中所指定的字符集其实就是数据库客户端应用程序所使用的字符集。
如果客户端应用程序不支持NLS_LANG中所包含的字符集或者所支持的字符集与NLS_LANG中的字符集不兼容,则会出现乱码。
2,此外,即使客户端字符集和数据库字符集相同,也可能会出现乱码。
假如,Oracle数据库为AL32UTF8字符集,客户端使用UTF-8字符集。
然而,现实情况总是很复杂的。如果客户端和数据库所支持的UNICODE标准不一样,则在很罕见的情况下仍有可能出现乱码。
实验二:
此实验举例说明数据库不支持客户端字符集所包含的字符时会产生什么样的结果。
1,创建一个使用WE8MSWIN1252字符集的数据库。
本次实验创建了一个名为TALRASHA的数据库,其使用WE8MSWIN1252字符集。
以下是通过NLS_DATABASE_PARAMETERS视图所查询到的数据库NLS参数。
2,设置客户端系统的NLS_LANG环境变量
3,插入并查询数据
由于需要存储中文字符,故此处将代码页设置为936。

实验说明:
如上图所示,由于数据库字符集为WE8MSWIN1252,其不能正确地存储中文字符,但可以正确存储英文字符。
所以,查询结果中,中文为乱码,英文正常显示。
实验结论:
1,如果客户端应用程序所使用的字符集是数据库字符集的超集,或者客户端应用程序中的某些字符不在数据库字符集所表示的范围之内,则数据库在进行字符集转换时会产生错误的结果。
2,属于客户端字符集和数据库字符集交集中的字符能够正常存储和显示。
最终结论:
1,在查询数据时,客户端字符集应该等于数据库字符集或者是数据库字符集的超集。从而避免显示结果出现乱码的问题。
2,在数据输入时,客户端字符集应该等于数据库字符集或者是数据库字符集的子集。从而使得输入字符能够在数据库中正确地保存。
3,在创建数据库时,尽可能使用UNICODE字符集,从而避免字符数据不能正确存储的问题。
五,举例说明一些特殊情况
通过以上两个实验基本说明了客户端应用程序字符集,客户端系统的NLS_LANG所包含的字符集和Oracle数据库字符集三者之间的关系。
但是,某些数据库客户端应用程序有自己独立的客户端环境配置,其不依赖于客户端系统中的NLS环境变量或者依仅赖于某些系统环境变量。
例如,PL/SQL Developer和SQL Developer。它们的编辑器有自己的字符集和字体的设置,同时这两个软件也支持一些其他设置(如日期格式或者地区等)。
所以,在进行第四部分的试验一时,建议先通过这两个应用程序插入数据。
此外,还需要注意字体对数据显示的影响。有的字体不能正确地显示输入或查询结果中的字符也会产生问题。
如何设置Oracle数据库客户端字符集以及系统中的NLS_LANG环境变量的更多相关文章
- 简单说明如何设置系统中的NLS_LANG环境变量
概述:本地化是系统或软件运行的语言和文化环境.设置NLS_LANG环境参数是规定Oracle数据库软件本地化行为最简单的方式.NLS_LANG参数不但指定了客户端应用程序和Oracle数据库所使用的语 ...
- 在W10系统中配置Java环境变量后,cmd命令提示符找不到java
java环境变量配置在W10系统上和以前有所区别,可能是W10版本导致也可能是W10一开始就出问题. 问题的表现就是你在环境变量里已经配置完JAVA_HOME,CLASSPATH,path之后在控制台 ...
- Oracle 11g客户端在Linux系统上的配置步骤详解
Oracle 11g客户端在Linux系统上的配置步骤详解 2011-07-26 10:47 newhappy2008 CSDN博客 字号:T | T 本文我们主要介绍了Oracle 11g客户端在L ...
- Oracle数据库date类型与Java中Date的联系与转化
以下是对Java中的日期对象与Oracle中的日期之间的区别与联系做点说明,以期对大家有所帮助.new Date():分配 Date 对象并初始化此对象,以表示分配它的时间(精确到毫秒),就是系统当前 ...
- win7 64位系统装oracle11 提示环境变量path 值超过1023字符
win7 64位系统装oracle10 提示环境变量path 值超过1023字符 1.提示环境变量path 值超过1023字符. 方案: 1.oracle安装文件,右键属性--设置兼容性--兼容XP ...
- 查看和设置Oracle数据库字符集
数据库服务器字符集select * from nls_database_parameters,其来源于props$,是表示数据库的字符集. 客户端字符集环境select * from nls_inst ...
- 修改Oracle数据库的字符集为UTF-8
1.改客户端字符集:通过WINDOWS的运行菜单运行Regedit,修改注册表 Start -> Run -> Rededit <-| Under registry Editor - ...
- Confluence 6 设置 Oracle 数据库准备
请查看 Supported Platforms 页面来获得 Confluence 系统支持的 Oracle 数据库版本.你需要在安装 Confluence 之前升级你的 Oracle 数据库. 如果你 ...
- oracle 数据库 NLS_CHARACTERSET 字符集的修改
修改Oracle 数据库字符集总结:修改方式大约有3种:方法一: (最安全的方法)数据库创建以后,如果需要修改字符集,通常需要重建数据库,通过导入导出的方式来转换.方法二: (最常用的方法)通过 &q ...
随机推荐
- 【java提高】---java反射机制
java反射机制 一.概述 1.什么是反射机制 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态 ...
- Linux命令之sftp - 安全文件传输命令行工具
用途说明 sftp命令可以通过ssh来上传和下载文件,是常用的文件传输工具,它的使用方式与ftp类似,但它使用ssh作为底层传输协议,所以安全性比ftp要好得多. 常用方式 格式:sftp <h ...
- Dubbo(二) —— dubbo配置
一.配置原则 JVM 启动 -D 参数优先,这样可以使用户在部署和启动时进行参数重写,比如在启动时需改变协议的端口. XML 次之,如果在 XML 中有配置,则 dubbo.properties ...
- Vimtutor(中文版)学习笔记各章小结
在Bash中直接输入 vimtutor 打开新世界!通常阅读完需要25-30分钟不等,像玩游戏一样学会vim,然后爱不释手 里面设置了很多例子通过实践操作来学,这里仅把vimtutor上的每一章小结记 ...
- HBase2实战:HBase Flink和Kafka整合
1.概述 Apache官方发布HBase2已经有一段时间了,HBase2中包含了许多个Features,从官方JIRA来看,大约有4500+个ISSUES(查看地址),从版本上来看是一个非常大的版本了 ...
- Java开发知识之Java编程基础
Java开发知识之Java编程基础 一丶Java的基础语法 每个语言都有自己的语法规范.例如C++ 入口点是main. 我们按照特定格式编写即可. Java也不例外. Java程序的语法规范就是 Ja ...
- linux添加C#运行环境
linux是不带C#的运行环境的,同样的还有.NET. 有一个叫做Mono的很好用http://www.go-mono.com/,有给docker,而且有环境的选择,要注意. 安好后有给样例的程序,编 ...
- 老代码多=过度耦合=if else?阿里巴巴工程师这样捋直老代码
简介 在业务开发的过程中,往往存在平台代码和业务代码耦合严重难以分离.业务和业务之间代码交织缺少拆解的现象.平台和业务代码交织导致不易修改,不同业务的代码交织增加了不同负责团队之间的协同成本.因此不论 ...
- [零] Java 语言运行原理 JVM原理浅析 入门了解简介 Java语言组成部分 javap命令使用
Java Virtual Machine 官方介绍 Java虚拟机规范官方文档 https://docs.oracle.com/javase/specs/index.html 其中以java8的为 ...
- MySQL 笔记整理(4) --深入浅出索引(上)
笔记记录自林晓斌(丁奇)老师的<MySQL实战45讲> 4) --深入浅出索引(上) 一句话简单来说,索引的出现其实就是为了提高数据查询的效率,就像书的目录一样. 索引的常见模型 哈希表: ...