Oracle学习笔记 字符集概述
Posted 新站
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle学习笔记 字符集概述相关的知识,希望对你有一定的参考价值。
Oracle 学习笔记 字符集概述
这节课开始讲oracle里面的字符集
偏重于原理和简单的一些判断以及实现
字符集它涉及到很多的东西
比如建库和操作系统环境
这节课把字符集的原理性的东西以及常见的操作讲一下
大家以后不要在字符集方面犯一些错误
以后字符集的问题基本都可以解决了
一)字符集的发展
通过查找各方面资料
这里把字符集的发展自己先简单梳理了一下
字符集是编号和字符的对应表
是为了让计算机使用和显示出来人们使用的语言和符号
这个编号就是编码表中的编码
而字符的表现都是字模的形式
一个编码对应着一个图形类型的字模
人们向计算机输入字符,计算机通过编码表把它转变为编码
这些编码在计算机内部处理或运算
而需要查看处理过程和结果的时候
因为有了这种编码就可以从这些编码表中找到对应的字模
并有系统绘制或显示出来
计算机控制运算和传输只能使用二进制的1和0
要输入和显示出的文字和符号都要有一个转变为0、1和由0、1转变来的过程
这样就需要用二进制来标定它们
计算机需要使用编码表来完成这个工作
在地球上
计算机使用最早的字符集是
BCD(binary coded decimal)编码表
只有十个数据
用二进制表示从0到9十个数字
只要四位二进制就够了
这些对计算机是不够的
因为计算机还要使用字母和控制符
而恰好计算机最早出现在使用英语的美国
所以IBM公司(国际商用机器公司)制定了EBCDIC编码
EBCDIC码(Extended Binary Coded Decimal Interchange Code)
广义二进制编码的十进制交换码
对BCD码扩展
使用八位二进制表示256个包括数字、英文字符、控制符和其它一些常用字符
这时美国国家标准局(ANSI)也制定了ASCII码
即美国标准信息交换码(American Standard Code for Information Interchange)
被国际标准化组织( International Organization for Standardization, ISO )批准为国际标准
称为ISO 646标准
基本的 ASCII 字符集,使用了七位二进制,共有 128 个字符,
其中有 96 个可打印字符,包括常用的字母、数字、标点符号等,另外还有 32 个控制字符
EBCDIC和ASCII中都主要是英文字母,但在字符的位置和排列顺序上不一样
在计算机技术发展的早期,如ASCII和EBCDIC这样的字符集逐渐成为标准
数字0到9使用BCD编码4位的二进制就可以实现
英文字符、控制符和一些常用的符号用7位二进制的标准ASCII可以完成
但是世界上的符号包括文字非常的多
各个国家都要使用计算机
就需要更多的二进制数来和他们对应
首先字母文字国家把这种编码表扩充到了8位
ISO 陆续制定了一批适用于不同地区的扩充 ASCII 字符集
最低的128个代码总是相同的,较高的128个代码取决于定义内码表的语言
这多余的128个码位的不同扩展,就形成了一系列ISO-8859-*的标准
代表性的是实现了西欧语言编码的ISO-8859-1(即Latin-1)
它向下兼容ASCII,是一种西欧字符集
像东亚的国家
每个文字都是一个独立的符号
用8位只256个空间无法表示
所以位数被进一步扩展
使用了16位二进制为自己的国家制定了编码表
用于显示本国的语言
不同的国家和地区制定了不同的标准,
由此产生了 GB2312, BIG5, JIS 等各自的编码标准
它们使用2个字节来代表一个字符
每个字符使用一个字节编码,这样的字符集就是单字节字符集SBCS(Single-byte Character Sets)
每个字符最多使用两个字节编码,这样的字符集就是双字节字符集DBCS(Double-byte Character Sets)
某些字符的编码超过了一个字节,这样的字符集就是多字节字符集MBCS(Multi-byte Character Sets)
在中国,中国国家标准委员会开始了设计工作
保留ASCII的127号以前的编码并把编码扩展到两个字节
方案中可以组合出大约7000多个中文字符,这就是国标(国家标准GB)2312
是中国国家标准简体中文字符集,全称《信息交换用汉字编码字符集·基本集》,又称GB0
GB2312 是对 ASCII 的中文扩展
由于GB2312只收录6763个汉字,于是微软利用GB 2312未使用的编码空间,制定了GBK编码
GBK即汉字内码扩展规范
K为汉语拼音 Kuo Zhan(扩展)中“扩”字的声母
英文全称Chinese Internal Code Specification
也使用了双字节编码方案。
在香港出现了Big5,又称大五码
是繁体中文(正体中文)最常用字符集标准,共收录13060个汉字
这些出现的由ASCII扩展而来,用于单种语言的编码表又被微软使用为ANSI编码
在简体中文系统下,ANSI 编码代表 GB2312 编码,
在日文操作系统下,ANSI 编码代表 JIS 编码
它们既兼容ASCII又互相不兼容
这时世界已形成出了多种的字符编码体系
包括分别以ASCII和EBCDIC为基础并且由它们扩展而来的编码体系
还有SAP(systems applications and products in data processing)体系等
SAP在德国,是全球企业管理软件与解决方案的技术领袖,同时也是市场领导者
SAP既是公司名称,又是其产品企业管理解决方案的软件名称
每种编码体系都有各种文字的很多的编码表
但是各自的编码不同,适用于不同的环境
EBCDIC编码体系主要由IBM生产的机器使用,
如IBM的大型机S/390、zSeries及其上的操作系统IBMOS/390、z/OS
和IBM的中小型机AS/400、IBM i系列及其上的操作系统OS/400、i5/OS
IBM的个人计算机和工作站操作系统使用的是文本的工业标准编码ASCII码
如:AIX(Advanced Interactive eXecutive)IBM开发的一套UNIX操作系统
它的平台的字符编码是基于 ASCII 的
一般地说,开放的操作系统(LINUX 、WINDOWS等)采用ASCII 编码,
而大型主机系统(MVS 、OS/390)等采用EBCDIC 编码。
绝大多数所熟悉的系统都是使用ASCII
在每个体系中还存在一个问题
各个语言的编码表自己独立使用是可以的
如果放在一起使用会发生同一编码对应不同文字的冲突问题
为了解决这个问题
一个软件制造商的协会unicode组织和国际标准化组织(ISO)
都进行了把世界上所有的字符放在一起进行统一编码的工作
ISO开发了ISO 10646项目,Unicode协会开发了Unicode项目
Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案
而Unicode只与ASCII兼容(更准确地说,是与ISO-8859-1兼容)
“ Universal Multiple-Octet Coded Character Set”,简称UCS
是由ISO制定的ISO 10646(或称ISO/IEC 10646)标准所定义的标准字符集
当双方认识到世界不需要两个不兼容的字符集
它们开始合并双方的工作成果,并为创立一个单一编码表而协同工作
从Unicode 2.0开始,Unicode采用了与ISO 10646-1相同的字库和字码
ISO也承诺使两方保持一致
目前两个项目仍都存在,并独立地公布各自的标准。
UCS编码有自己的格式:UCS-2和UCS-4等等
在编码层面上
UCS-2就是用两个字节编码
UCS-4就是用4个字节(实际上只用了31位,最高位必须为0)编码。
unicode在编码上和UCS保持一致,在实现上有自己的规则,而UCS只定义了编码标准。
unicode的实现形式上有UTF-8,UTF-16,UTF-32,还有UTF-7等。
UTF是“UCS Transformation Format”的缩写
都是将数字转换到程序数据的编码方案。
UTF-16是UCS-2的扩展,UTF-32是UCS-4的子集。
一般对于UNICODE来说,UCS-2是内码,而UTF-8等则是它的实现方式
中国为了和ISO 10646编码接轨制定了国家标准GB13000
等同于国际标准的《通用多八位编码字符集 (UCS)》 ISO10646.1
就是等同于Unicode的标准,代码页等等的都使用UTF的一套标准
一共使用四个字节
目前所有字符代码的前两个字节都是0
因此默认情况下按照两字节处理
而GBK并非国家正式标准
仅是GB 2312到GB 13000.1-93之间的过渡方案
但GB13000标准目前发展缓慢
GB 18030全称:国家标准GB 18030-2005《信息技术中文编码字符集》
是中华人民共和国现时最新的内码字集
GB 18030与GB 2312-1980完全兼容,与GBK基本兼容,支持GB 13000及Unicode的全部统一汉字,
共收录汉字70244个
与 UTF-8 相同,采用多字节编码,每个字可以由1个、2个或4个字节组成
GB18030是我国继GB2312-1980和GB13000-1993之后最重要的汉字编码标准,
是未来我国计算机系统必须遵循的基础性标准之一
在windows中这些编码表被称为代码页,也称为“内码表”
早期,代码页是IBM称呼计算机的Bios所支持的字符集编码
操作系统直接使用BIOS提供的字符绘制功能来显示字符(或者是一组嵌入在显卡字符生成器中的字形)
操作系统的编码支持也就依靠BIOS的编码
这时的代码页被集成在硬件中,由制造商选择集成哪种代码页,称作OEM(原始设备制造商)代码页
最具代表性的是”IBM PC或MS-DOS 代码页437”。
随着图形用户界面操作系统的广泛使用,操作系统本身具有了字符绘制的功能
Windows代码页最初是根据ANSI草案实现的
微软在Windows操作系统没有转向UTF-16作为内码实现之前(也就是在Windows 2000之前),
针对不同的使用地区与国家,定义了一系列的支持不同语言字符集的代码页,
被称作”Windows(或ANSI)代码页”。
这是Windows代码页被称作ANSI的缘由。
ANSI由ASCII标准编码扩展而来,它们既兼容ASCII又互相不兼容
ANSI code pages实际上是一系列的编码集合,
是微软自己定义的代码页
根据操作系统区域设置而激活其中一种作为ANSI编码由系统默认使用。
在保存文件时编码选择ANSI就是选择这个默认的编码。
公司电脑(英文系统)上的ANSI code page可能是1252,而家里的中文系统则可能是936
在简体中文操作系统中ANSI编码默认指的是GB系列编码(GB2312、GBK);
在繁体中文操作系统中ANSI编码默认指的是BIG5;
在日文操作系统中ANSI编码默认指的是Shift JIS
ANSI编码是在Windows中特别是在windows安装过程中可以指定为默认代码页
为了使windows系统本地化而选择的一种本地语言编码表
由于世界上有很多的语种,
每种语言的ANSI编码指的都是这种语言对应的编码表,国家不同代码页也不同
在windows中同时只能选择一种代码页作为ANSI编码使用
ANSI代码页的特点:
编码0至127符合ANSI制定的ASCII编码标准
是由微软制定并实现的
编码最多两个字节
ANSI使用最明显的例子:
widows中保存文本文件一般
里面有四个选项:ANSI,Unicode,Unicode big endian 和 UTF-8
(1)ANSI是默认的编码方式。
对于英文文件是ASCII编码,对于简体中文文件是GB2312编码
(只针对Windows简体中文版,如果是繁体中文版会采用Big5码)。
(2)Unicode编码指的是UCS-2编码方式,即直接用两个字节存入字符的Unicode码。
这个选项用的little endian格式。
(3)Unicode big endian编码与上一个选项相对应。
(4)UTF-8编码
它们就是windows系统正在使用的字符集
第一个选项就是使用的系统默认的ANSI代码页
在windows中的代码页是微软系统使用的当然要由微软指定
对于ANSI编码微软往往都是先得到相应国家自己制定的标准
然后微软对其进行修改或扩充得到自己的代码页
如繁体中文的BIG5编码,日本的Shift JIS编码,西欧iso-8859-1
微软以原编码为基础
对其修改扩充后分别得到的代码页编号为950,932,1252
简体中文GBK码
是微软在GB2312-80标准基础上的内码扩展规范,使用了双字节编码方案
完全兼容GB2312-80标准,支持国际标准ISO/IEC10646-1和国家标准GB13000-1中的全部中日韩汉字,
并包含了BIG5编码中的所有汉字
GBK对应代码页936
Windows平台上的GUI程序使用ANSI代码页,
而控制台程序Windows 中的字符模式的应用程序(使用命令提示符窗口的应用程序)
使用过去在 DOS 中使用的代码页。
由于历史原因,这些代码页称为 OEM(原始设备制造商)代码页
这两种代码页在前128个字符的编码是一样的,
但后128个字符的编码可能不一致。
而现在图形系统中提供的OEM代码页只是为了和早期使用OEM代码页的程序兼容
字符要在系统中绘制
还需要字符编码表对应的字模库,也称字形库
计算机最早使用的是点阵字体字模,
到现在有了很多的矢量字体字模,又称轮廓字体、描边字体,
TrueType字体与PostScript字体、OpenType字体是主要的三种
点阵字体也叫位图字体,其中每个字形都以一组二维像素信息表示
矢量字库保存的是对每一个字的描述信息
比较而言点阵字体优点是显示速度快,最大的缺点是不能放大
现在点阵字体仍在被广泛的使用
Windows使用的字库也为以上两类,
在FONTS目录下,如果字体扩展名为FON,表示该文件为点阵字库,扩展名为TTF则表示矢量字库
下面简单的列一下windows中几个代码页和字符集的对应关系
分三列,分别表示
代码页编号、对应编码名称、说明
37 IBM037 IBM EBCDIC (US-Canada) 就是最早的EBCDIC编码表
437 IBM437 OEM United States 美国扩展ASCII表,最初的IBM PC代碼頁,实现了扩展ASCII字符集
20127 us-ascii US-ASCII 就是基础的7位ASCII编码
65000 utf-7 Unicode (UTF-7)
65001 utf-8 Unicode (UTF-8)
65005 utf-32LE Unicode (UTF-32)
65006 utf-32BE Unicode (UTF-32 Big-Endian)
1200 UTF-16LE Unicode(UCS-2LE Unicode) (little-endian小端序)
1201 UTF-16BE Unicode(UCS-2BE Unicode) (big-endian大端序)
20936 GB2312 简体中文(GB2312)
936 GBK 简体中文(GBK)
54936 GB18030 简体中文(GB18030)
950 BIG5 繁體中文(大五碼)
932 Shift_JIS 日文(Shift_JIS)
949 EUC-KR 韓文(EUC-KR)
28591 iso-8859-1 西欧字符 (ISO)Latin-1 西歐拉丁字母
28605 iso-8859-15 Latin 9 (ISO) 西欧语言
1252 Windows-1252 西欧字符(Windows)
有个别情况要说明:
Windows 1252和ISO 8859-1基本等同但并不完全一致,
ISO-8859-1在0x80-0x9F范围的控制字符,在Windows-1252中被可打印字符取代。
由于在web网页中,ASCII控制字符不起作用,
所以网页一般用Windows-1252代码页标记替代ISO-8859-1标记。
iso-8859-15 Latin 9 字符集是iso-8859-1 Latin 1字符集的更新版本,
去掉一些不常用的字符,增加修正了部分字符,增加了欧元字符
每种编码集在不同的编码体系中有不同的别名
如iso-8859-1编码:
ISO-8859-1编码也是单字节编码,最多能够表示256个字符。
Latin1是ISO-8859-1的别名,有些环境下写作Latin-1
在OEM(IBM PC)代码页编号是 850 —“多语言(Latin-1)” (西欧语言)
IBM中叫它Code page 819 or CP819
Oracle中则是WE8ISO8859P1编码或WE8MSWIN1252编码
SAP中是SAP Code page 1100
在windows中被使用为28591和1252代码页
又如UTF-8:
UTF-8在IBM称作代码页1208,在微软称作代码页65001,在SAP称作代码页4110
在oracle中对编码的命名有一定的规则
如:
AL32UTF8
【AL】支持所有语言(All Language)。
【32】每字符最多占用32位(4字节)。
【UTF8】编码为UTF-8。
WE8MSWIN1252
【WE】支持西欧语言(Western Europe)。
【8】每字符需要占用8位(单字节)。
【MSWIN1252】编码为CP1252。
US7ASCII
【US】表示美国(United States)。
【7】每字符需要占用7位。
【ASCII】编码为ASCII。
其它如ZHS16GBK,ZHT16BIG5,US8PC437(编码为OEM cp437),都可以类推
二)字符集概念
继续讲课课程
首先看一下
oracle的字符集,什么叫字符集
字符集说白了是一个集合
是一张表,这个表有两列
左面这列是字符是所有要存储的字符
字符有很多字符
比如我们讲中文字符
左面这列就是中国人常用的所有的中文字符
有汉字、英文字母有数字还有一些特殊的符号
在左面都出现是我们中文要使用的所有的字符
右边是一个编码,从1号2、3、4、5、6
将来提到1的时候就对应着一个字符
所以说字符集就是字符和编码的这么一个对应表
我们知道在计算机里面只能存储数字
我们不能存储一个字符,存储不了字符
但是我们还想在计算机里面存储字符
我们就做了一件事情
将字符对应成编码存储起来
比如我要存中文
中文里面的“中国”这两个字符
我们就找这个字符集
“中”和“国”分别对应着两个编码
把两个编码存储到数据库里面去
这是存储的时候
显示的时候
根据两个编码再来查
显示的是”中”和”国”
把两个字符显示出来
这就是我们计算机里面的字符集的概念
在计算机里面很多地方都有字符集的概念
我们的oracle数据库也有字符集的概念
因为oracle要存字符
有字符就需要字符集的概念
三)有字符集的地方
简单讲一下哪些地方有字符集
1)操作系统
第一个操作系统有字符集
比如我们的windows有字符集
linux也有字符集,unix也有字符集
操作系统os本身有字符集
比如我们的linux字符集我们可以看一下
使用locale命令
[oracle@redhat4 ~]$ locale
LANG=zh_CN.UTF-8
LC_CTYPE="zh_CN.UTF-8"
LC_NUMERIC="zh_CN.UTF-8"
LC_TIME="zh_CN.UTF-8"
LC_COLLATE="zh_CN.UTF-8"
LC_MONETARY="zh_CN.UTF-8"
LC_MESSAGES="zh_CN.UTF-8"
LC_PAPER="zh_CN.UTF-8"
LC_NAME="zh_CN.UTF-8"
LC_ADDRESS="zh_CN.UTF-8"
LC_TELEPHONE="zh_CN.UTF-8"
LC_MEASUREMENT="zh_CN.UTF-8"
LC_IDENTIFICATION="zh_CN.UTF-8"
LC_ALL=
这个命令结果中
当前的字符集是UTF-8
还有locale 加上 -a 参数
[oracle@redhat4 ~]$ locale -a
aa_DJ
aa_DJ.iso88591
aa_DJ.utf8
aa_ER
aa_ER@saaho
aa_ER.utf8
aa_ER.utf8@saaho
aa_ET
aa_ET.utf8
.
.
.
zh_CN
zh_CN.gb18030
zh_CN.gb2312
zh_CN.gbk
zh_CN.utf8
zh_HK
zh_HK.big5hkscs
zh_HK.utf8
zh_SG
zh_SG.gb2312
zh_SG.gbk
zh_SG.utf8
zh_TW
zh_TW.big5
zh_TW.euctw
zh_TW.utf8
zu_ZA
zu_ZA.iso88591
zu_ZA.utf8
结果内容较多只列出一部分
可以展示出linux支持的所有的字符集
还支持zh_HK.big5hkscs
大5码,香港人用的
还支持zh_SG.gbk
我们的国标
还支持zh_TW.utf8
UNICODE类字符集
这里有它支持的所有字符集
在windows里面支持的当前的字符集
先打开 windows 的 命令提示符
有一个chcp命令
C:\\WINDOWS>chcp
活动的代码页: 936
活动代码页是936
936是中文字符集
这是我们操作系统有字符集
2)oracle数据库
oracle数据库本身有字符集
数据库软件里面带着字符集
它也带着很多张表
一个表是一种字符集
字符集可以认为是一张表
是一张字符和编码的对应表
oracle有字符集说明oracle有这张表
oracle支持很多种字符集说明oracle里面有很多种这张表
操作系统有字符集也有这张表
3)软件
还有一些软件跟oracle一样
本身也带字符集
有些软件本身是不带字符集的
有些软件有字符集
oracle或者一些别的软件有字符集
他就自己使用自己的
有些软件不带字符集的字符集
他就使用操作系统字符集
要注意这个地方
看看软件本身有没有字符集
后面还会通过例子去强调
字符集就是字符和编码的这么一张对应表
操作系统和oracle都有字符集的概念
四)什么时候用字符集
我们访问一个表
访问t2这张表
先把t2中的数据都删了
SQL> delete from t2;
1 row deleted.
SQL> commit;
Commit complete.
先查一下
SQL> select * from t2;
no rows selected
没有数据
SQL> desc t2;
Name Null? Type
----------------------------------------- -------- ----------------------------
ID NUMBER
NAME VARCHAR2(20)
t2这张表有两个列
一个是ID列 类型是NUMBER 数字列
NAME列 是VARCHAR2列 VARCHAR是字符
所以说对这个表来讲
表t2有两列
有id列类型是number
name列类型是varchar
对id列来讲,因为它是数字列,没有字符的概念
对这个列来讲不用字符集
往这个列中插入数据和删除数据、显示数据的时候
它不涉及到字符的概念字符集的概念
但是name列 类型是varchar 或varchar2
因为这个列存储的是字符
往这个列中插入删除还有显示数据的时候
这个列要用到字符集的概念
如果一个数据库里面没有varchar
只有类似于number这样的这种列
这个数据库可以没有字符集的概念
但大家想想没有可能,不可能
所有的数据库里面的表总有varchar
而且还以varchar为主
什么时候使用字符集呢
(1)当我们用来存储CHAR, VARCHAR2, CLOB, LONG等类型数据的时候
这四种类型都是放字符的
char是固定长度放字符的
varchar是可变长度放字符的
clob是大对象,比如我们把一片文章存进去
long也是大对象,但它现在像是慢慢被clob取代了
当我们的列是这四种列的时候
往这四种列存数据的时候用到字符集
当然了还有数据字典里面
(2)用来标示诸如表名、列名以及PL/SQL变量等
(3)用来存储SQL和PL/SQL程序单元等
数据字典里面的一些char和varchar,clob和long也要用到数据库字符集
五)国家字符集
还有一种用到的字符集
我们在oracle安装的时候
有两个字符集
一个是数据库字符集
一个是国家字符集
看一下我们oracle安装过程的时候
在其中安装的一步的时候
在调sga、pga里面
我们还可以看到有字符集的选择
我们有两种字符集
第一是数据库字符集,我们选择了
第二是国家字符集,我们也选择了
这两个字符集含义
是分别应用在不同场合
当我们建立一个表
这个表如果它的列的类型是char varchar clob long
这个时候oracle就使用数据库字符集
如果我们建了一个表
它的数据类型是 nchar nvarchar2 或nclob
这个时候针对这个表我们就使用国家字符集
现在表t2它的有个列是varchar
我往t2插入数据和显示数据的时候
它会用到数据库字符集
再建立一个表t3
SQL> create table t3(id number,name nvarchar2(20));
Table created.
这是建了一个表
SQL> desc t3;
Name Null? Type
----------------------------------------- -------- ----------------------------
ID NUMBER
NAME NVARCHAR2(20)
这个时候针对表t3它的列是nvarchar
对表t3来讲
我要能往里面存储数据和显示数据的时候
用到国家字符集
向t3表中插入数据
SQL> insert into t3 values(1,'中国');
1 row created.
查看使用的字符集
SQL> select id,name,dump(name,1016) from t3;
ID NAME DUMP(NAME,1016)
---------- ------ --------------------------------------------------
1 中国 Typ=1 Len=4 CharacterSet=AL16UTF16: 4e,2d,56,fd
可以看出CharacterSet=AL16UTF16
这里说明是使用的国家字符集
一个表中同时存在varchar和nvarchar时
就是即使用数据库字符集又使用国家字符集时
国家字符集的设置只对nvarchar的列起作用
新建一个表t4,包含varchar列和nvarchar列
SQL> create table t4(id number,name varchar(20),namen nvarchar2(20));
Table created.
SQL> desc t4;
Name Null? Type
------- -------- --------------------------------------------------------
ID NUMBER
NAME VARCHAR2(20)
NAMEN NVARCHAR2(20)
向t4中插入数据
SQL> insert into t4 values(1,'中国','中国');
1 row created.
查看数据的编码
SQL> select id,name,dump(name,1016),namen,dump(namen,1016) from t4;
ID NAME DUMP(NAME,1016) NAMEN DUMP(NAMEN,1016)
---------- ------ -------------------------------------------------- ------ --------------------------------------------------
1 中国 Typ=1 Len=4 CharacterSet=ZHS16GBK: d6,d0,b9,fa 中国 Typ=1 Len=4 CharacterSet=AL16UTF16: 4e,2d,56,fd
可以看出varchar列使用的数据库字符集ZHS16GBK
而nvarchar列使用的是国家字符集AL16UTF16
所以国家字符集不是作用于整个表
而是作用于使用它的列
六)数据库字符集状况
我们可以查一下数据库用到字符集的状况
SQL> select * from nls_database_parameters;
PARAMETER VALUE
------------------------------ ----------------------------------------
NLS_LANGUAGE AMERICAN
NLS_TERRITORY AMERICA
NLS_CURRENCY $
NLS_ISO_CURRENCY AMERICA
NLS_NUMERIC_CHARACTERS .,
NLS_CHARACTERSET ZHS16GBK
NLS_CALENDAR GREGORIAN
NLS_DATE_FORMAT DD-MON-RR
NLS_DATE_LANGUAGE AMERICAN
NLS_SORT BINARY
NLS_TIME_FORMAT HH.MI.SSXFF AM
NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR
NLS_DUAL_CURRENCY $
NLS_COMP BINARY
NLS_LENGTH_SEMANTICS BYTE
NLS_NCHAR_CONV_EXCP FALSE
NLS_NCHAR_CHARACTERSET AL16UTF16
NLS_RDBMS_VERSION 10.2.0.1.0
20 rows selected.
数据库的字符集
NLS_CHARACTERSET ZHS16GBK
是中文字符集
目前数据库的字符集是中文字符集
国家字符集是
NLS_NCHAR_CHARACTERSET AL16UTF16
数据库里面是两个字符集
第一叫数据库字符集
第二叫国家字符集
当前数据库系统使用环境
数据库字符集是中文字符集
国家字符集是AL16UTF16
通过
select * from nls_database_parameters;
这个sql语句可以查出来
一般来讲国家字符集用的比较少
一般都是使用数据库字符集
国家字符集往往作为数据库字符集的一个补充
它们应用场合不同
七)常用字符集
讲到这个地方我们看一下字符集的命名
比如对oracle数据库来讲
有几个经典的字符集
经常关注
US7ASCII
ZHS16CGB231280
AL32UTF8
AF16UTF16
ZHS16GBK
utf8
这几个字符集
我们关注字符集的时候其实就关注一个地方
这个字符集能存储哪些字符
比如这个US7ASCII码
这是美国人使用的字符集
它只能存储美国人的使用的字符
美国人存储使用的字符不超过128个
我们学计算机的时候
学ascii码都知道
我们的ascii码一共使用一个字节8个位来表示
对美国人来讲它只使用右边的7位,最高位是0
所以说它只使用7位
只能存储常见的26个英文字母数字
以及加减乘除等字符
不超过128个
这是美国人用的字符集US7ASCII
zhs16cgb231280是中国人用的字符集
里面可以存中文
这是我们的中文的国标
这个字符集比较老
里面并没有存储所有的中文字符集,相对少一些
最新的中文字符集是ZHS16GBK
我们都用这个最新的中文字符集
zhs16cgb231280这个字符集所容纳的所有的字符
ZHS16GBK都有
也就是说ZHS16GBK是zhs16cgb231280的超集
超集不意味着严格超集
所谓的超集就是
zhs16cgb231280里面有的字符
ZHS16GBK里面都有是超集
严格超集是
zhs16cgb231280里面有的字符
ZHS16GBK里面都有
而且zhs16cgb231280里面字符对应的编码
和ZHS16GBK里面对应的编码是一样的
这就是严格超集
比如说zhs16cgb231280和ZHS16GBK是超集的关系
但不是严格超集的关系
比如“中国”两个字
在zhs16cgb231280有,在ZHS16GBK里面也有
但是在zhs16cgb231280里面的编码
和在ZHS16GBK里面的编码是不一样的
所以只能说是超集不能说是严格超集
这是中文
还有一个utf8字符集
叫unicode字符集
zhs16cgb231280和ZHS16GBK这两个里面存的是中国人常用的字符
US7ASCII存的是美国人常用的字符
比如说“中石油”,这是个跨国企业
有一张表专门存储员工的姓名的
对中石油来讲
它既有中国人也有韩国人也有日本人也有津巴布韦非洲人
有很多员工
这些员工的名字是有各个国家的名字
它们有自己的语言
所以说这个表里面现在有一个需求
数据库里面
有张表,有列
有一个列是varchar将来可以存字符
存字符要用到数据库字符集
这里面将来要存储的
第一存储中文,第二英文,第三日文,第四韩语
要存储很多字符集字符
要用中文字符集不行
英文字符集不行
日文韩文都不行
针对日文韩文都有相关的字符集都不行
这个时候针对这个问题
有一些比较大的公司它们统一起来做了一张字符集
叫unicode字符集
当时它设计的初衷是
将全世界所有的字符以及对应的编码编成一个字符集
unicode字符集也是字符集
左面是字符右面是编码
只不过它左边的字符不仅仅局限于中文英文
它的初衷是把全世界所有的字符全部编到这个编码里面去
然后给它统一性编码
也就是说如果说数据库是unicode字符集的话
也就意味着它可以存储全世界所有的字符
所以一开始推出了一个utf8,u开头的字符集
因为当时基于技术以及各个方面的限制
这个utf8它的初衷是存储全部的字符
但是并没有做到
只是存储了部分字符集
但是里面有中英文日文都有
只不过没有那么全而已
utf8是一个比较老的unicode字符集
最后随着技术的改进
又推出了AL32UTF8这个最新的字符集
这个字符集比utf8字符就多的多了
它含的字符集范围就非常广了
所以说要用unicode字符集的话那就用AL32UTF8
对国家字符集来讲我们统一的选AF16UTF16
这个字符集也是unicode字符集
unicode字符集有三个
AL32UTF8
AF16UTF16
utf8
对数据库字符集来讲,我们通常选择AL32UTF8
对国家字符集来讲,我们选择AF16UTF16
因为AL32UTF8是unicode最新字符集
AF16UTF16是数据库国家字符集
八)存储中文的选择
如果一个数据库里面我们将来要存中文
有几种选择
对国家字符集来讲
我们只选择AF16UTF16没有别的选择
对数据库字符集来讲
如果我将来要存中文有两种办法
第一种办法
我们将数据库字符集设成AL32UTF8
将来存中文肯定没问题
第二个办法
做成ZHS16GBK
如果确认数据库里面将来只存中文当然里面也包括英文
只存中英文
也就是说只是中国人使用
最好把它设成ZHS16GBK
AL32UTF8它里面是可以存中文
但是每一个中文所对应的字符编码会消耗更多的空间
也就是说AL32UTF8它全,但是在性能上会差一些
考虑到性能我们最好用ZHS16GBK
如果存中文,如果只存中文那就是ZHS16GBK
如果你是国际化、国际型的企业那就是UTF8
选择AL32UTF8的话在很多地方会涉及到字符编码的转换
以及占用过多的空间
占用过多的空间就意味着
将来io啊网络啊等等会有更大的负载
这就是数据库字符集该如何选择
US7ASCII中的US表示语言存的是英语
7是也就是将来编码是用7位
ASCII是编码
对我们中国人来讲
将来用ZHS16GBK用16位,GBK表示国标,
是使用我们中国人,我们的中文国标来进行编码
九)有多少字符集可以选择
我们到底有多少字符集可以选择
可以使用
select * from V$NLS_VALID_VALUES;
看一下
SQL> select * from V$NLS_VALID_VALUES;
PARAMETER VALUE ISDEP
--------------- ------------------------- -----
LANGUAGE AMERICAN FALSE
LANGUAGE GERMAN FALSE
LANGUAGE FRENCH FALSE
LANGUAGE CANADIAN FRENCH FALSE
.
.
.
LANGUAGE THAI FALSE
LANGUAGE JAPANESE FALSE
LANGUAGE KOREAN FALSE
LANGUAGE SIMPLIFIED CHINESE FALSE
LANGUAGE TRADITIONAL CHINESE FALSE
LANGUAGE ENGLISH FALSE
.
.
.
TERRITORY AMERICA FALSE
TERRITORY UNITED KINGDOM FALSE
.
.
.
TERRITORY UNITED ARAB EMIRATES FALSE
TERRITORY THAILAND FALSE
TERRITORY CHINA FALSE
TERRITORY HONG KONG FALSE
TERRITORY JAPAN FALSE
TERRITORY KOREA FALSE
TERRITORY TAIWAN FALSE
.
.
. FALSE
CHARACTERSET US7ASCII FALSE
CHARACTERSET WE8DEC FALSE
.
.
.
CHARACTERSET WE8PC858 FALSE
CHARACTERSET WE8ISO8859P1 FALSE
CHARACTERSET EE8ISO8859P2 FALSE
CHARACTERSET SE8ISO8859P3 FALSE
CHARACTERSET NEE8ISO8859P4 FALSE
CHARACTERSET CL8ISO8859P5 FALSE
CHARACTERSET AR8ISO8859P6 FALSE
CHARACTERSET EL8ISO8859P7 FALSE
CHARACTERSET IW8ISO8859P8 FALSE
CHARACTERSET WE8ISO8859P9 FALSE
CHARACTERSET NE8ISO8859P10 FALSE
.
.
.
CHARACTERSET IW8MSWIN1255 FALSE
CHARACTERSET LT8MSWIN921 FALSE
CHARACTERSET TR8MSWIN1254 FALSE
CHARACTERSET WE8MSWIN1252 FALSE
.
.
.
CHARACTERSET JA16VMS FALSE
CHARACTERSET JA16EUC FALSE
CHARACTERSET JA16EUCYEN FALSE
CHARACTERSET JA16SJIS FALSE
CHARACTERSET JA16DBCS FALSE
CHARACTERSET JA16SJISYEN FALSE
CHARACTERSET JA16EBCDIC930 FALSE
CHARACTERSET JA16MACSJIS FALSE
CHARACTERSET JA16EUCTILDE FALSE
CHARACTERSET JA16SJISTILDE FALSE
CHARACTERSET KO16KSC5601 FALSE
CHARACTERSET KO16DBCS FALSE
CHARACTERSET KO16KSCCS FALSE
CHARACTERSET KO16MSWIN949 FALSE
CHARACTERSET ZHS16CGB231280 FALSE
CHARACTERSET ZHS16MACCGB231280 FALSE
CHARACTERSET ZHS16GBK FALSE
CHARACTERSET ZHS16DBCS FALSE
CHARACTERSET ZHS32GB18030 FALSE
CHARACTERSET ZHT32EUC FALSE
CHARACTERSET ZHT32SOPS FALSE
CHARACTERSET ZHT16DBT FALSE
CHARACTERSET ZHT32TRIS FALSE
CHARACTERSET ZHT16DBCS FALSE
CHARACTERSET ZHT16BIG5 FALSE
CHARACTERSET ZHT16CCDC FALSE
CHARACTERSET ZHT16MSWIN950 FALSE
CHARACTERSET ZHT16HKSCS FALSE
CHARACTERSET AL24UTFFSS TRUE
CHARACTERSET UTF8 FALSE
CHARACTERSET UTFE FALSE
CHARACTERSET AL32UTF8 FALSE
CHARACTERSET ZHT16HKSCS31 FALSE
CHARACTERSET JA16EUCFIXED TRUE
CHARACTERSET JA16SJISFIXED TRUE
CHARACTERSET JA16DBCSFIXED TRUE
CHARACTERSET KO16KSC5601FIXED TRUE
CHARACTERSET KO16DBCSFIXED TRUE
CHARACTERSET ZHS16CGB231280FIXED TRUE
CHARACTERSET ZHS16GBKFIXED TRUE
CHARACTERSET ZHS16DBCSFIXED TRUE
CHARACTERSET ZHT32EUCFIXED TRUE
CHARACTERSET ZHT32TRISFIXED TRUE
CHARACTERSET ZHT16DBCSFIXED TRUE
CHARACTERSET ZHT16BIG5FIXED TRUE
CHARACTERSET AL16UTF16 FALSE
.
.
.
SORT TCHINESE_RADICAL_M FALSE
SORT BIG5 FALSE
SORT HKSCS FALSE
SORT TCHINESE_STROKE_M FALSE
SORT SCHINESE_PINYIN_M FALSE
SORT SCHINESE_STROKE_M FALSE
SORT GBK FALSE
SORT SCHINESE_RADICAL_M FALSE
SORT JAPANESE_M FALSE
SORT KOREAN_M FALSE
494 rows selected.
返回内容较多只截取了部分显示
第一列是LANGUAGE的部分
如:
LANGUAGE AMERICAN FALSE
这是字符集关于语言的设置
第一列是CHARACTERSET
如:
CHARACTERSET US7ASCII FALSE
是关于字符集的设计
结果中有非常多的字符集可以设置
全部都可以设
有oracle支持的所有的字符集
有CHARACTERSET AL16UTF16 FALSE
字符集
是最后面的一个字符集
还有
CHARACTERSET AL32UTF8 FALSE
这个字符集unicode字符集
中文字符集可以去找一下
CHARACTERSET ZHS16GBK FALSE
是中文字符集
还有一些日文字符集
如:
CHARACTERSET JA16SJISTILDE FALSE
除了我们中英文以外
还有一些字符集
以后做数据库的时候经常会碰到
就是我们的繁体
繁体字符集里面又分台湾的和香港的
香港的都用大5码
因为现在的我们的台湾企业和香港企业很多
所以说你将来毕业以后如果去香港企业的话
你会发现它的字符集很多用大5码
大5码是繁体中文
存简体中文的时候可能有问题
在返回结果中的第三列是ISDEPRECATED
中文翻译是:是否被启用
就是因为版本升级的原因,有些参数可能在新版本中已不再被使用
如果当前还被使用这个值是FALSE
如果当前版本已经不使用这个参数了,这个值就是true
记住这里有一个视图可以去查<
以上是关于Oracle学习笔记 字符集概述的主要内容,如果未能解决你的问题,请参考以下文章