专栏首页小麦苗的DB宝专栏【DB笔试面试796】在Oracle中,如何查看和设置字符集?

【DB笔试面试796】在Oracle中,如何查看和设置字符集?

题目部分

在Oracle中,如何查看和设置字符集?

答案部分

NLS(National Language Support,国家语言支持)是数据库的一个非常强大的特性,控制着数据的许多方面,最重要的两个方面包括:1、文本数据采用何种编码存储在磁盘上。2、透明地将数据从一个字符集转换到另一个字符集。Oracle字符集可以分为数据库字符集和客户端字符集。客户端字符集定义了客户端字符数据的编码方式,任何发自或发往客户端的字符数据均使用客户端定义的字符集编码,客户端可以看作是能与数据库直接连接的各种应用,例如SQL*Plus、exp/imp等。客户端字符集是通过设置NLS_LANG参数来设定的。

1、NLS_LANG参数组成

NLS_LANG参数由以下部分组成:

NLS_LANG=<LANGUAGE>_<TERRITORY>.<CLIENTS CHARACTERSET>

NLS_LANG各部分含义如下:

①、LANGUAGE指定:

l Oracle服务器消息使用的语言是中文还是英文

l 日期中月份和日显示

②、TERRITORY指定

l 货币和数字格式

l 地区和计算星期及日期的格式

③、CHARACTERSET:

l 控制客户端应用程序使用的字符集

l 通常设置或者等于客户端(如Windows)代码页

l 或者对于UNICODE应用设置为UTF8

从NLS_LANG的组成可以看出,真正影响数据库字符集的其实是第三部分。所以,两个数据库之间的字符集只要第三部分一样就可以相互导入导出数据,前面影响的只是提示信息是中文还是英文。

2、Windows代码页

在Windows上查看当前系统的代码页可以使用chcp命令:

E:\>chcp
活动代码页: 936

3、查看NLS_LANG的方法

Unix使用env或echo查看:

[ZFLHRDB1:oracle]:/oracle>env|grep NLS_LANG
NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
[ZFLHRDB1:oracle]:/oracle>echo $NLS_LANG
AMERICAN_AMERICA.ZHS16GBK

Windows使用echo或set命令查看:

C:\Users\lhr>set NLS_LANG
NLS_LANG=AMERICAN_CHINA.ZHS16GBK
C:\Users\lhr>echo %NLS_LANG%
AMERICAN_CHINA.ZHS16GBK

当然,若Windows上安装了Cygwin软件的话,也可以像Linux那样查询:

C:\Users\lhr>env|grep NLS_LANG
NLS_LANG=AMERICAN_CHINA.ZHS16GBK

4、查看Oracle数据库的字符集

数据库字符集在创建数据库时指定,在创建后通常不能更改。在创建数据库时,可以指定字符集(CHARACTER SET)和国家字符集(NATIONAL CHARACTER SET)。国家字符集实质上是为Oracle选择的附加字符集,主要作用是为了增强Oracle的字符处理能力。国家字符集在Oracle 9i中进行了重新定义,只能在UNICODE编码中的AL16UTF16和UTF8中选择,默认值是AL16UTF16。

有多种办法可以查看数据库的字符集,但是作者一般使用USERENV来查看数据库的字符集,如下所示:

SYS@lhrdb> SELECT USERENV('LANGUAGE') 数据库字符集 FROM DUAL;
数据库字符集
----------------------------------------------------
AMERICAN_AMERICA.ZHS16GBK

另外,也可以通过如下的视图来获取Oracle的数据库字符集:

SELECT * FROM NLS_DATABASE_PARAMETERS;--数据库服务器字符集,来源于PROPS$
SELECT * FROM NLS_INSTANCE_PARAMETERS;--客户端字符集,来源于V$PARAMETER
SELECT * FROM NLS_SESSION_PARAMETERS;--会话字符集,来源于V$NLS_PARAMETERS,表示会话自己的设置,可能是会话的环境变量或者是由ALTER SESSION完成,如果会话没有特殊的设置,将与NLS_INSTANCE_PARAMETERS一致
SELECT * FROM V$NLS_PARAMETERS;
SELECT * FROM SYS.PROPS$;

客户端的字符集要求与服务器一致,才能正确显示数据库的非ASCII字符。如果多个设置存在,那么优先级是:ALTER SESSION>环境变量>注册表>参数文件。字符集要求一致,但是语言设置却可以不同。

5、查看Oracle支持的字符集

可以查询视图V$NLS_VALID_VALUES来获取Oracle数据库支持的字符集,从下面的SQL可以看出大约支持200多种字符集。

SYS@lhrdb> SELECT T.PARAMETER,
  2         COUNT(T.VALUE)
  3  FROM   V$NLS_VALID_VALUES T
  4  GROUP  BY T.PARAMETER
  5  HAVING COUNT(T.VALUE) > 1;
PARAMETER         COUNT(T.VALUE)
----------------- --------------
LANGUAGE                      67
TERRITORY                     98
SORT                          87
CHARACTERSET                 247

6、设置Oracle的NLS_LANG参数

在Windows上常用set命令,而在Linux系统上常用export命令来设置NLS_LANG参数。

设置中文语言环境:

NLS_LANG="SIMPLIFIED CHINESE_CHINA.ZHS16CGB231280"
NLS_LANG="SIMPLIFIED CHINESE_CHINA.ZHS16GBK"
NLS_LANG="SIMPLIFIED CHINESE_CHINA.AL32UTF8"

设置英文语言环境:

NLS_LANG="AMERICAN_AMERICA.ZHS16CGB231280"
NLS_LANG="AMERICAN_AMERICA.ZHS16GBK"
NLS_LANG="AMERICAN_AMERICA.AL32UTF8"

Linux上设置示例如下所示:

[ZFLHRZHDB1:oracle]:/oracle>echo $NLS_LANG
AMERICAN_AMERICA.ZHS16GBK
[ZFLHRZHDB1:oracle]:/oracle>sqlplus / as sysdba
SQL*Plus: Release 11.2.0.4.0 Production on Tue Oct 25 14:14:46 2016
Copyright (c) 1982, 2013, Oracle.  All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Data Mining and Real Application Testing options
SYS@lhrdb> SELECT USERENV('LANGUAGE') FROM DUAL;
USERENV('LANGUAGE')
----------------------------------------------------
AMERICAN_AMERICA.ZHS16GBK
SYS@lhrdb> exit
Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Data Mining and Real Application Testing options
[ZFLHRZHDB1:oracle]:/oracle>export NLS_LANG="SIMPLIFIED CHINESE_CHINA.AL32UTF8"
[ZFLHRZHDB1:oracle]:/oracle>sqlplus / as sysdba
SQL*Plus: Release 11.2.0.4.0 Production on 星期二 10月 25 14:15:51 2016
Copyright (c) 1982, 2013, Oracle.  All rights reserved.
连接到: 
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Data Mining and Real Application Testing options
SYS@lhrdb> SELECT USERENV('LANGUAGE') FROM DUAL;
USERENV('LANGUAGE')
----------------------------------------------------
SIMPLIFIED CHINESE_CHINA.ZHS16GBK     <=====可以看到数据库字符集是ZHS16GBK,而客户端字符集是AL32UTF8

在Linux上可以将NLS_LANG的参数写入.bash_profile文件中让其永久生效。

本文选自《Oracle程序员面试笔试宝典》,作者:小麦苗

本文分享自微信公众号 - DB宝(lhrdba),作者:小麦苗best

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-05-11

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【DB笔试面试465】如何使用批量动态SQL(FORALL及BULK子句的使用)?

    批量动态SQL即在动态SQL中使用BULK子句,或使用游标变量时在FETCH中使用BULK,或在FORALL子句中使用BULK子句来实现。

    小麦苗DBA宝典
  • 【DB笔试面试772】在Oracle中,RMAN、NBU备份分别是什么?

    数据备份重于一切,每个DBA都应该对备份恢复了然于胸。在数据库维护中,备份是重中之重的事,而恢复也是检验一个DBA是否合格的重要标识。

    小麦苗DBA宝典
  • Oracle中如何导出存储过程、函数、包和触发器的定义语句?如何导出表的结构?如何导出索引的创建语句?

    今天小麦苗给大家分享的是Oracle中如何导出存储过程、函数、包和触发器的定义语句?如何导出表的结构?如何导出索引的创建语句?。

    小麦苗DBA宝典
  • 学习Java基础知识,打通面试关~十三锁机制

    用户2196435
  • Android Service启动到Activity

    从Service启动到Activity基本可以分为两类: 1.从自己应用的Service启动自己应用的Activity,即显式意图; 2.从自己应用的Ser...

    IT大飞说
  • Python安装升级pip

    py3study
  • 贪心算法问题-LeetCode 55、45(贪心算法,跳跃问题)

    给定一个非负整数数组,你最初位于数组的第一个位置。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个位置。

    算法工程师之路
  • 合肥城市POI数据综合运用研究——功能区识别

    本次研究将以我生活了6年的合肥为例,利用静态POI数据对合肥中心城区进行分析研究,主要分为三个方面:城市功能区识别、城市休闲娱乐活力评价以及典型区域空间价值分析...

    IT技术小咖
  • Java并发-23.Fork/Join框架

    悠扬前奏
  • 【剑指offer】二维数组中的查找

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

    韩旭051

扫码关注云+社区

领取腾讯云代金券