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

本文深入解析Oracle数据类型中的字符集概念及字符串类型应用,涵盖单字节与双字节字符集的区别,以及char、varchar2、nchar、nvarchar2四种字符串类型的特性与使用场景。
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用来记录别的语言
Oracle数据库提供了多种字符串数据类型,常见的有以下几种: ### CHAR `CHAR` 是固定长度的字符数据类型。当存储的数据长度小于定义的长度时,Oracle会用空格进行填充。`CHAR` 类型的最大长度为2000字节。例如,创建一个 `CHAR` 类型的列: ```sql CREATE TABLE char_example ( column1 CHAR(10) ); ``` 插入数据时,如果插入的数据长度小于10个字符,Oracle会自动在后面补空格。 ### VARCHAR2 `VARCHAR2` 是可变长度的字符数据类型,它只占用实际存储字符所需的空间。在Oracle 11g之前,`VARCHAR2` 最多可以存储4000个字符;从Oracle 12c开始,通过设置相应的参数,最大支持32767个字符[^1]。示例如下: ```sql CREATE TABLE varchar2_example ( column1 VARCHAR2(200) ); ``` ### CLOB `CLOB`(Character Large Object)用于存储大量的字符数据,最大可以存储4GB的字符数据。适合存储文本文件、文章内容等大文本数据。创建 `CLOB` 类型列的示例: ```sql CREATE TABLE clob_example ( column1 CLOB ); ``` ### NCLOB `NCLOB` 与 `CLOB` 类似,也是用于存储大量字符数据,但它基于国家字符集,适合存储多语言的大文本数据,同样最大可存储4GB的数据。示例: ```sql CREATE TABLE nclob_example ( column1 NCLOB ); ``` ### NVARCHAR2 `NVARCHAR2` 是可变长度的基于国家字符集的字符数据类型,其长度限制与 `VARCHAR2` 类似,在Oracle 11g之前最大长度为4000个字符,Oracle 12c及以后可支持更大长度。示例: ```sql CREATE TABLE nvarchar2_example ( column1 NVARCHAR2(100) ); ``` ### LONG `LONG` 也是用于存储可变长度的字符数据,最大长度为2GB。不过,`LONG` 已经逐渐被 `CLOB` 类型取代,不建议在新的数据库设计中使用。示例: ```sql CREATE TABLE long_example ( column1 LONG ); ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值