Oracle字符集的设置_dbeaver客户端oracle字符集设置-程序员宅基地

技术标签: 数据库教程  

一、字符集的概念

1、字符编码(character encoding):

字符编码是一种法则,在数字与符号之间建立的对应关系。不同的国家有不同的语言,包含的文字、标点符号、图形符号各有不同。例如在ASCII编码中,用数字97表达字符’a’与字符集相对应,常见的字符编码有ASCII,GBK,GB18030,Unicode等。

2、字符集(Character set)

字符集是字符的集合,字符是文字和符号的总称,用ASCII编码的字符集称之为ASCII字符集,用GBK编码的字符集称之为GBK字符集。

3、国际编码(Unicode)

为了解决传统的字符编码方案的局限,1994年发布了Unicode(国际编码、统一码、万国码、单一码、通用码),它是计算机科学领域里的一项业界标准,包括字符集、编码方案等。Unicode 将全世界所有的字符统一化,统一编码,再也不存在字符集不兼容和字符转换的问题。

Unicode 有以下三种编码方式:

1)UTF-8:兼容ASCII编码;拉丁文、希腊文等使用两个字节;包括汉字在内的其它常用字符使用三个字节;剩下的极少使用的字符使用四个字节。

2)UTF-16:对相对常用的60000余个字符使用两个字节进行编码,其余的使用4字节。

3)UTF-32:固定使用4个字节来表示一个字符,存在空间利用效率的问题。

4、汉字的编码

支持汉字(简体中文)的编码有GB2312、GB13000、GBK、GB18030和Unicode(UTF-8、UTF-16、UTF-32)。

1)GB2312

仅包含大部分的常用简体汉字,但已经不能适应现在的需要。

2)GB13000

由于GB2312的局限性,国家标准化委员会制定了GB13000编码;但由于当时的硬件和软件都已经支持了GB2312,而GB13000与GB2312完全不兼容,所以没有能够得到大范围的推广使用。

3)GBK

有了GB13000的教训,中国国家标准化委员会制定了GBK标准,并兼容了GB2312标准,同时在GB2312标准的基础上扩展了GB13000包含的字;由于该标准有微软的支持,得到了广泛的应用。

4)GB18030

GB18030编码比GBK又新增了几千个汉字,但由于码位不足使用了2byte与4byte混合编码方式,这给软件开发增加了难度。

5)Unicode

包含全世界所有国家需要用到的字符,是国际编码,通用性强。

5、汉字的编码选择

在操作系统和数据库中,常用的汉字编码有GBK、GB18030和Unicode,GBK和GB18030的优势是占用空间小,Unicode的优势是全球化的支持。

在应用开发中,如果不考虑全球化,最好的选择是GBK和GB18030。

6、编码的转换

GBK和GB18030与Unicode编码之间需要转换,否则会出现汉字乱码。

二、Oracle的字符集

1、字符集和国家字符集

字符集在创建数据库实例时指定,可以指定字符集(CHARACTER SET)和国家字符集(NATIONAL CHARACTER SET)。

1)字符集(CHARACTER SET)

用来存储char、varchar2、clob、long等类型数据,还可以用来标识表名、列名以及PL/SQL变量等。

2)国家字符集(NATIONAL CHARACTER SET)

用以存储nchar、nvarchar2、nclob等类型数据。国家字符集实质上是为Oracle选择的附加字符集,主要作用是为了增强字符处理能力,因为nchar数据类型可以提供对亚洲使用定长多字节编码的支持,而数据库字符集则不一定能。国家字符集只能在unicode编码中的AF16UTF16和UTF8中选择,默认值是AF16UTF16。

2、支持中文的字符集

Oracle支持汉字(简体中文,繁体不介绍)的字符集有多种,常用的有ZHS16GBK、UTF8、AL32UTF8和AL16UTF16。

1)ZHS16GBK

表示简体中文,一个字符需要16位比特,采用GBK编码标准。

2)UTF8

Oracle从8i版本开始使用的属于UTF-8编码的字符集,采用的Unicode标准为3.0,在11.2版本中,UTF8已经不是推荐字符集列表中的一员了。

3)AL32UTF8

与UTF8相比,它采用的Unicode版本更新,在10g版本中使用的是Unicode 4.01标准,而UTF8因为兼容性的考虑,在10g版本中用的是Unicode 3.0标准。

4)AL16UTF16

是ORACLE第一种采用UTF-16编码方式的字符集,从ORACLE9开始使用,是作为缺省的国家字符集使用,它不能被用作数据库的字符集。

3、NLS_LANG参数

Oracle数据库字符集最重要的参数是NLS_LANG参数。

格式: NLS_LANG=‘language_territory.charset’,不区分大小写,例如’ SIMPLIFIED CHINESE_CHINA.ZHS16GBK’。

它有三个组成部分:语言(language)、地域(territory)和字符集(charset)。

其中:

language:数据库服务器提示信息的语言。

territory:数据库的日期和数字格式,意义不大。

charset:数据库的字符集。

真正影响数据库字符集的其实是第三部分charset,两个数据库之间的字符集只要第三部分相同,交换数据时中文不会出现乱码。language影响的只是提示信息是中文还是英文。

三、服务端的字符集

1、查看服务端字符集

执行以下SQL可以查看服务端的字符集。

select * from NLS_DATABASE_PARAMETERS where parameter like '%CHARACTERSET%';

在这里插入图片描述

执行以下SQL也可以查看服务端的字符集。

select userenv('language') from dual;

在这里插入图片描述

2、修改服务端字符集

Oracle数据库实例创建后,如果没有开始业务运行,可以修改字符集,如果已经业务化运行,不建议修改字符集,会造成数据中的汉字乱码。

用DBA权限,执行以下步骤修改Oracle数据库的字符集(例如修改为ZHS16GBK)。

1)修改服务端操作系统的NLS_LANG环境变量。

export NLS_LANG='Simplified Chinese_China.ZHS16GBK'

2)关闭Oracle数据库。

shutdown immediate;

3)把数据库启动到mount状态。

startup mount;

4)把数据库改为restricted模式。

alter system enable restricted session;
alter system set job_queue_processes=0;
alter system set aq_tm_processes=0;

5)打开数据库。

alter database open;

6)修改数据库的字符集。

alter database character set internal_use ZHS16GBK;

7)重启数据库。

shutdown immediate;
startup;

四、客户端的字符集

Oracle客户端的字符集必须与服务端相同,否则中文会出现乱码。

1、Linux环境

客户端的字符集由NLS_LANG环境变量控制。

1)查看NLS_LANG环境变量。

env|grep NLS_LANG

在这里插入图片描述

2)设置环境变量

修改环境变量参数文件(系统或用户的profile文件)。

export NLS_LANG='Simplified Chinese_China.ZHS16GBK'

2、Windows环境

打开注册表( 执行regedit.exe)

HKEY_LOCAL_MACHINE -> SOFTWARE -> ORACLE -> KEY_OraClient11g_home1

在这里插入图片描述

五、应用经验

1)数据库在业务化之前,就应该确定Oracle的字符集,然后不再改变。数据库在业务化后,修改字符集是一件很麻烦的事情,最好别惹这个麻烦。

2)如果项目没有全球化的需求,数据库字符集建议采用ZHS16GBK,操作系统语言建议采用gbk。

3)只要把客户端和服务端设置成相同的字符集,就不会有乱码,没什么技术难点。

4)虽然GB18030字符集比GBK更丰富,但是GB18030中有部分汉字是4字节,这一点让程序员很郁闷,所以,程序员更倾向GBK字符集。

六、版权声明

C语言技术网原创文章,转载请说明文章的来源、作者和原文的链接。
来源:C语言技术网(www.freecplus.net)
作者:码农有道

如果文章有错别字,或者内容有错误,或其他的建议和意见,请您留言指正,非常感谢!!!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/wucz122140729/article/details/105094178

智能推荐

前端工作小结70-获取接口token_前端如何获取token的值-程序员宅基地

文章浏览阅读1.2k次。前端_前端如何获取token的值

gymnasium.error.NamespaceNotFound: Namespace ALE not found. Have you installed the proper package fo_namespace gym_examples not found. have you…-程序员宅基地

文章浏览阅读512次。运行下面这段代码时出现如下错误。_namespace gym_examples not found. have you…

JavaScript HTML CSS显示隐藏二级菜单(下拉菜单)_html css javascript左侧菜单栏隐藏和显示功能-程序员宅基地

文章浏览阅读7.9k次,点赞5次,收藏32次。一级菜单效果如图一所示按键选项一 至 选项四是一级菜单当点击选项一时 弹出二级菜单 效果如图二所示(其余一级菜单也有对应的二级菜单)html构造<body> <div> <ul id='ul_0'> <li><a οnclick="javascript:Foo(); return false;" href="#">二级菜单</a> </li> <li_html css javascript左侧菜单栏隐藏和显示功能

解决“右键菜单不显示‘用VSCode打开文件和文件夹’选项”的问题_vscode打开文件夹没显示-程序员宅基地

文章浏览阅读1.3w次,点赞28次,收藏41次。一、重装软件在装的过程中勾选上这两个选项即可(肯定我们不愿意,很多配置 插件都用习惯了,再装很费事,即使是setting sync也免不了麻烦,所以这个我们不推荐)安装勾选二、修改注册表1、右键打开文件1, Win+R 打开运行,输入regedit,打开注册表,找到HKEY_CLASSES_ROOT\*\shell分支,如果没有shell分支,则在*下点击右键,选择“新建-项”,建立shell分支。2, 在shell下新建“VisualCode”项,在右侧窗口的“默认”双击,_vscode打开文件夹没显示

一文搞定Java中的枚举_java 枚举-程序员宅基地

文章浏览阅读1.1k次,点赞3次,收藏4次。而枚举中定义的枚举常量,变成了相应的 public static final 属性,而且其类型就抽象类的类型,名字就是枚举常量的名字。位向量是一种极为高效的位运算操作,由于直接存储和操作都是 bit,因此 EnumSet 空间和时间性能都十分可观,足以媲美传统上基于 int 的 “位标志” 的运算,关键是我们可像操作 set 集合一般来操作位运算。枚举的主要目的是加强编译时类型的安全性。枚举在日常编码中几乎是必不可少的,如何用好,如何用精,还需要基础知识的铺垫,本文也正是基于此带大家从头到尾梳理了一遍。_java 枚举

dell台式计算机主板电池,怎么更换主板电池 主板电池更换方法【步骤详解】-程序员宅基地

文章浏览阅读1.1w次。我门知道主板是电脑配件的核心之一。那么主板电池也是非常重要的存在。有人问主板电池有什么用?其实主板电池是记录计算机系统的时间和维持CMOS的BIOS信息的电能所在,但主板电池没电之后,时间会回到出厂日期,操作系统也无法正常开机。听到这么说,你肯定不会以为主板电池不重要了吧!那么主板电池没电了该怎么更换呢?来,小编带你去看看!主板电池没电会出现以下现象:1、电脑每次开机,时间都会恢复到初始时间,也就..._dell电脑更换主板电池

随便推点

SpringCloudConfig配置完成后客户端读取不到配置中心的配置文件_配置中心读取不到文件-程序员宅基地

文章浏览阅读3.3k次。有可能是客户端启动类上使用的是 @EnableEurekaClient注解,可以尝试改成@EnableDiscoveryClient/** * 开启eureka客户端功能 *///@EnableEurekaClient/** * @EnableEurekaClient和@EnableDiscoveryClient都让注册中心能够发现,扫描到该服务。 * 不同点:@EnableEurekaClient只适用于Eureka作为注册中心,@EnableDiscoveryClient 可以是其_配置中心读取不到文件

RedHat7.6安装11gRAC+应用最新的PSU_redhat 7.6 rac-程序员宅基地

文章浏览阅读1.1k次。两个机器的系统初始化(略)参考https://blog.csdn.net/sudahai102448567/article/details/119611507一、安装Grid1.安装软件包yum install -y binutils* compat-libcap1 compat-libstdc* gcc* gcc-c++* glibc* ksh* libgcc* libstdc++* libaio* make* sysstat* elfutils-libelf-devel* xterm s._redhat 7.6 rac

Linux操作系统桌面环境GNOME和KDE的切换_linux切换桌面环境-程序员宅基地

文章浏览阅读1.7w次。一、设置GNOME或者KDE为默认的启动桌面环境  方法1:修改/etc/sysconfig/desktop,根据需要将“DESKTOP”后面的内容改为KDE或GNOME。  方法2:在当前用户目录下建立“.xinitrc”这个文件(注意文件名前有一个点号,代表建立的是一个隐藏文件),文件的内容就一行startkde或gnome-session,根据自己的需要选择KDE或GNOME。二、GNOME和_linux切换桌面环境

【MyBatis】 MyBatis与MyBatis-Plus的区别_mybatisplus和mybatis的区别-程序员宅基地

文章浏览阅读5.2w次,点赞119次,收藏356次。mybatis-plus 是 mybatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。_mybatisplus和mybatis的区别

手把手教你开发一款1024程序员节日历提醒服务_1024程序员节 app设计-程序员宅基地

文章浏览阅读854次,点赞4次,收藏6次。前言关于这次程序员节1024征文的内容,自己确实想了好久,作为一名后端研发工程师,不太想去搞一个酷炫的界面,感觉那是前端同学的蛋糕,想利用自己的 Golang 技术栈搞一波儿事情。同时又想有所创新,搞点别人没有搞过的,终于昨天确定了文章的内容——开发一款1024程序员节的日历提醒服务,今天开始正式干活儿。正文本文介绍的1024程序员节日历提醒服务,主要有两个功能,一个提供主动查询能力,另一个是注册节日的回调通知,下面将分别进行介绍。一、主动查询1024程序员节日历提醒服务提供了节日查询接_1024程序员节 app设计

【PostgreSQL】------ pg sql先判断是否存在表在创建表结构--实例代码_pg数据库驱动连接创建表报错create table if not exists-程序员宅基地

文章浏览阅读1.1k次。// if not exists 不存在CREATE TABLE if not exists "public"."DCS_YZYHK_CARD" ( "ID" varchar(50) COLLATE "pg_catalog"."default" NOT NULL, "ORG_ID" varchar(50) COLLATE "pg_catalog"."default", "ORG_NAME" varchar(100) COLLATE "pg_catalog"."default", "ZW.._pg数据库驱动连接创建表报错create table if not exists

推荐文章

热门文章

相关标签