Oracle 数据分为四类
--
Oracle_built_in_datatypes 内置数据
--ANSI_supported_datatypes
--user_defined_types 用户自定义数据
--
Oracle_supplied_types
内置数据类型中:字符串类型是很重要的一个类型
字符串类型是保存文本信息的类型。文本可能是各种语言的文本,我们知道语言包括很多种,比如英语是字母的,包括26个字母
在计算机里都是用二进制表示,表示的形式就想01010011,一个字节一共有8位
那么,一个字节的长度的二进制有2的8次方=256种组合,英语的所有字符加上控制字符都可以用一个字节的二进制位来表示
所以,常见的英语字符集US7ASCII就是单字节字符集,一个字符的长度就是一个字节
而中文是象形文字,中文的字符集一共有好几千个汉字,可是一个字节只能表示256种不同的字符,所以,就需要两个字节来表示,2的16次方就够了
总结:
英语字符集US7ASCII是单字符字符集,1字符=1BYTE
中文字符集ZHS16GBK是双字符字符集 1字符=2BYTE
--------------------------------------------------------------------分割线-------------------------------------------------------------------------------
ps:
数据类型定义
在%ORACLE_HOME/rdbms/admin下
standard.sql
首先 vi standard.sql
里面有个stdspce.sql
stdspec.sql这个脚本就放着对数据类型,包括很多函数的定义
这个包也是oracle经常用到的
-------------------------------------------------------------------分割线------------------------------------------------------------------------------------
字符串类型在Oracle中分为4种:char 、varchar2、nchar、nvarchar2
1. char(size byte|char)
char的缺省单位是byte,也就是说char(2) = char(2 byte)
char有两种指定长度的方法
第一种: char(2 byte),这是用字节指定,长度为两个字节
第二种: char(2 char),这是用字符指定,长度为两个字符,这就要看数据库的字符集是什么
如果,数据库字符集是双字符集,那么char(2 char)长度就是两个双字节字符,也就是四个字节
那么,如果字符集是三字节字符集,那么char(2 char)长度就是六个字节咯~~
比如,我的Oracle的字符集是中文字符集,那么1char = 2byte,这里,char(2 char) = 2*2byte = 4byte
1.1 char类型特点
char是一个固定长度的字符类型
这里我定义一个字段a为char(7)类型:
a char(7)
这里a的固定长度为7个字节
下面我给a赋值
a:=’老方块'
这里需要注意,中文字符集通常是双字节字符集,一个汉字2个字节,'老方块'需要用6个字节存放,oracle会额外填充一个字节的空格来达到char(7)的最大值7
6个字节+1个空格
单字节字符集 如英文字符集等
char(5 byte) = 5bytes
char(5 char) = 5×1 byte = 5bytes
双字节字符集 如中文字符集等
char(5 char) = 5×2 bytes = 10 bytes
对于多字节字符集
1 char = n bytes
如 1 char = 3 bytes , char(5 char) = 5×3 bytes = 15bytes
2.varchar2(size byte|char)
varchar2是一个变长度的字符串类型,与char类型不同,Oracle不会用空格填充至最大长度
varchar2的最大长度可以是4k
比如 varchar(7) = ’老方块'
这里varchar(7) 最大长度是7字节,实际存放'老方块'需要6个字节,那么实际存放的还是6字节的内容,不会用空格填充至7个字节。
varchar2是最常见的类型
在TOM的书里推荐在任何情况下都用varchar2,而不用char
3.Nchar(size)
nchar的单位是char 这里 char=几个字节就与数据库字符集有关了
对于Oracle这类全球范围内广泛使用的数据库来讲
在全球化的今天,对于跨国公司除了存在他们主流语言的字符集,还会存在适应不同国家语言字符集的支持
比如BBC公司有主流英文字符集,但它会有中文站,它得支持中文字符集
那么,如果我的数据库是中文字符集,但是,要存入非主流的中文字符,还另外附加了一种字符集,叫国家字符集
也就是所有国家语言都能支持的字符集
世界上专门有一个组织来定义这个字符集叫UNICODE
全球统一编码
比如 我数据库是中文字符集,那么name char(2 char),name字段只能存储中文
而如果name Nchar(2 char),name字段可以存储所有国家的语言字符集
那么如何支持国家字符集呢?
国家的英文单词首字母是N,所以要能用UNICODE,必须是N的字符类型,(换句话说,中文字符集的编码0101是和国家字符集UNICODE的编码不同)
所以Oracle提供了支持国家字符集的类型,由于不同字符集使用同一个字符(单词)所需要的字节长度不一样,空间浪费长度不一样,空间转换所消耗的资源也不一样。
所以我们选择一种最合适的字符集作为内置的数据库字符集,另外设置一份辅助的字符集来解决所有语言字符支持,它就是unicode
总结:
数据库字符集有两种:1、内置字符集。varchar2 用来记录经常使用的同一种语言
2、辅助字符集。 Nvarchar2用来记录别的语言