1. Oracle内置数据类型--字符串, 2. char的大小和字符集有关

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
 
对于多字节字符集
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用来记录别的语言

你可能感兴趣的:(1. Oracle内置数据类型--字符串, 2. char的大小和字符集有关)