阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Oracle varchar2或char类型的byte和char的区别

486次阅读
没有评论

共计 3533 个字符,预计需要花费 9 分钟才能阅读完成。

Oracle 定义字符串类型 VARCHAR2 和 CHAR 指定长度的用法如下:

varchar2(<SIZE> <BYTE|CHAR>) <SIZE> 是介于 1~4000 之间的一个数,表示最多占用 4000 字节的存储空间。
char(<SIZE> <BYTE|CHAR>) <SIZE> 是介于 1~2000 之间的一个数,表示最多占用 2000 字节的存储空间。
那其中的 BYTE 和 CHAR 有什么区别呢
BYTE, 用字节指定:VARCHAR2(10 BYTE)。这能支持最多 10 字节的数据,在一个多字节字符集中,这可能只是两个字符。采用多字节字符集时,字节与字符并不相同。

CHAR, 用字符指定:VARCHAR2(10 CHAR)。这将支持最多 10 字符数据,可能是多达 40 字节的信息。另外,VARCHAR2(4000 CHAR)理论上支持最多 4000 个字符的数据,不过由于 Oracle 中字符串数据类型限制为 4000 字节,所以可能无法得到全部 4000 个字符。

使用 UTF8 之类的多字节字符集时,建议你在 VARCHAR2/CHAR 定义中使用 CHAR 修饰会,也就是说,使用 VARCHAR2(30 CHAR),而不是 VARCHAR2(30),因为你的本意很可能是定义一个实际上能存储 30 字符数据的列。还可以使用会话参数或系统参数 NLS_LENGTH_SEMANTICS 来修改默认行为,即把默认设置 BYTE 改为 CHAR。不建议在系统级修改这个设置,而应该使用 ALTER SESSION 修改会话级。还有重要的一点,VARCHAR2 中存储的字节数上界是 4000。不过,即使你指定了 VARCHAR(4000 CHAR),可能并不能在这个字段中放下 4000 个字符实际上,采用你选择的字符集时,如果所有字符都要用 4 个字节来表示,那么这个字段中就只能放下 1000 个字符!
下面使用一个小例子展示 BYTE 和 CHAR 之间的区别,并显示出上界的作用。
测试环境 11.2.0.4,是在多字节字符集数据库上完成的,在此使用了字符集 AL32UTF8,这个字符集支持最新版本的 Unicode 标准,采用一种变长方式对每个字符使用 1~4 个字节进行编码
linuxidc@ORCL>col value for a30
linuxidc@ORCL>col parameter for a30
linuxidc@ORCL>select * from nls_database_parameters where parameter=’NLS_CHARACTERSET’;
 
PARAMETER              VALUE
—————————— ——————————
NLS_CHARACTERSET          AL32UTF8
linuxidc@ORCL>show parameter nls_leng
 
NAME                    TYPE                VALUE
———————————— ——————————— ——————————
nls_length_semantics            string                  BYTE

创建测试表

linuxidc@ORCL>create table t (a varchar2(1),b varchar2(1 char),c varchar2(4000 char));
 
Table created.

现在,这个表中插入一个 UTF 字符 unistr(‘\00d6’),这个字符长度为 2 个字节,可以观察到以下结果:
linuxidc@ORCL>select length(unistr(‘\00d6’)),lengthb(unistr(‘\00d6’)) from dual;
 
LENGTH(UNISTR(‘\00D6’)) LENGTHB(UNISTR(‘\00D6’))
———————– ————————
              1            2 
 
linuxidc@ORCL>insert into t (a) values (unistr(‘\00d6’));
insert into t (a) values (unistr(‘\00d6’))
                          *
ERROR at line 1:
ORA-12899: value too large for column “ZX”.”T”.”A” (actual: 2, maximum: 1)

这说明:VARCHAR(1)的单位是字节而不是字符。这里确实只有一个 Unicode 字符,但是它在一个字节中放不下;将应用从单字节定宽字符集移植到一个多字节字符集时,可能会发现原来在字段中能放下的文本现在却无法放下。第二点的原因是:在一个单字节字符集中,包含 20 个字符的字符串长度就是 20 字节,完全可以在 VARCHAR2(20)中放下。不过在一个多字节字符集中,20 个字符的长度可以达到 80 字节 (如果每个字符用 4 个字节表示),这样一杰,20 个 Unicode 字符很可能无法在 20 个字节中放下。你可能会考虑将 DDL 修改为 VARCHAR2(20 CHAR),或在运行 DDL 创建表时使用前面提到的 NLS_LENGTH_SEMENTICS 会话参数。
插入包含一个字符的字段时观察到以下结果:
linuxidc@ORCL>insert into t (b) values (unistr(‘\00d6’));
 
1 row created. 
 
linuxidc@ORCL>col dump for a30
linuxidc@ORCL>select length(b),lengthb(b),dump(b) dump from t;
 
 LENGTH(B) LENGTHB(B) DUMP
———- ———- ——————————
    1    2 Typ=1 Len=2: 195,150

这个 INSERT 成功了,而且可以看到,所有插入数据的长度 (LENGTH) 就是一个字符,所有字符串函数都以字符为单位工作。LENGTHB 函数 (字节长度) 显示出这个字段占用了 2 字节的存储空间,另外 DUMP 函数显示了这些字节到底是什么。这个例子展示了 VARCHAR2(N)并不一定存储 N 个字符,而只是存储 N 个字节。
下面测试 VARCHAR2(4000)可能存储不了 4000 个字符
linuxidc@ORCL>declare
  2  l_date varchar2(4000 char);
  3  l_ch  varchar2(1 char) := unistr(‘\00d6’);
  4  begin
  5  l_date:=rpad(l_ch,4000,l_ch);
  6  insert into t(c) values(l_date);
  7  end;
  8  /
declare
*
ERROR at line 1:
ORA-01461: can bind a LONG value only for insert into a LONG column
ORA-06512: at line 6

在此显示出,一个 4000 字符的实际上长度为 8000 字节,这样一个字符串无法永久地存储在一个 VARCHAR(4000 char)字段中,这个字符串能放在 PL/SQL 变量中,因为在 PL/SQL 中 VARCHAR2 最大可以达到 32K。不过,存储在表中,VARCHAR2 则被硬性限制为最多只能存放 4000 字节。我们可以成功地存储其中 2000 个字符:
linuxidc@ORCL>declare
  2  l_date varchar2(4000 char);
  3  l_ch  varchar2(1 char) := unistr(‘\00d6’);
  4  begin
  5  l_date:=rpad(l_ch,2000,l_ch);
  6  insert into t(c) values(l_date);
  7  end;
  8  /
 
PL/SQL procedure successfully completed. 
 
linuxidc@ORCL>
zx@ORCL>select length(c),lengthb(c) from t where c is not null;
 
 LENGTH(C) LENGTHB(C)
———- ———-
      2000      4000

更多 Oracle 相关信息见Oracle 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=12

本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-01/139853.htm

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-22发表,共计3533字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

星哥玩云

星哥玩云
星哥玩云
分享互联网知识
用户数
4
文章数
19350
评论数
4
阅读量
7899301
文章搜索
热门文章
开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南

开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南

开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南 大家好,我是星哥。之前介绍了腾讯云的 Code...
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见 zabbix!轻量级自建服务器监控神器在 Linux 的完整部署指南 在日常运维中,服务器监控是绕不开的...
阿里云CDN
阿里云CDN-提高用户访问的响应速度和成功率
随机文章
颠覆 AI 开发效率!开源工具一站式管控 30+大模型ApiKey,秘钥付费+负载均衡全搞定

颠覆 AI 开发效率!开源工具一站式管控 30+大模型ApiKey,秘钥付费+负载均衡全搞定

  颠覆 AI 开发效率!开源工具一站式管控 30+ 大模型 ApiKey,秘钥付费 + 负载均衡全...
星哥带你玩飞牛NAS-5:飞牛NAS中的Docker功能介绍

星哥带你玩飞牛NAS-5:飞牛NAS中的Docker功能介绍

星哥带你玩飞牛 NAS-5:飞牛 NAS 中的 Docker 功能介绍 大家好,我是星哥,今天给大家带来如何在...
多服务器管理神器 Nexterm 横空出世!NAS/Win/Linux 通吃,SSH/VNC/RDP 一站式搞定

多服务器管理神器 Nexterm 横空出世!NAS/Win/Linux 通吃,SSH/VNC/RDP 一站式搞定

多服务器管理神器 Nexterm 横空出世!NAS/Win/Linux 通吃,SSH/VNC/RDP 一站式搞...
每天一个好玩的网站-手机博物馆-CHAZ 3D Experience

每天一个好玩的网站-手机博物馆-CHAZ 3D Experience

每天一个好玩的网站 - 手机博物馆 -CHAZ 3D Experience 一句话介绍:一个用 3D 方式重温...
星哥带你玩飞牛 NAS-10:备份微信聊天记录、数据到你的NAS中!

星哥带你玩飞牛 NAS-10:备份微信聊天记录、数据到你的NAS中!

星哥带你玩飞牛 NAS-10:备份微信聊天记录、数据到你的 NAS 中! 大家对「数据安全感」的需求越来越高 ...

免费图片视频管理工具让灵感库告别混乱

一言一句话
-「
手气不错
星哥带你玩飞牛 NAS-9:全能网盘搜索工具 13 种云盘一键搞定!

星哥带你玩飞牛 NAS-9:全能网盘搜索工具 13 种云盘一键搞定!

星哥带你玩飞牛 NAS-9:全能网盘搜索工具 13 种云盘一键搞定! 前言 作为 NAS 玩家,你是否总被这些...
星哥带你玩飞牛NAS-16:不再错过公众号更新,飞牛NAS搭建RSS

星哥带你玩飞牛NAS-16:不再错过公众号更新,飞牛NAS搭建RSS

  星哥带你玩飞牛 NAS-16:不再错过公众号更新,飞牛 NAS 搭建 RSS 对于经常关注多个微...
安装并使用谷歌AI编程工具Antigravity(亲测有效)

安装并使用谷歌AI编程工具Antigravity(亲测有效)

  安装并使用谷歌 AI 编程工具 Antigravity(亲测有效) 引言 Antigravity...
星哥带你玩飞牛NAS-16:飞牛云NAS换桌面,fndesk图标管理神器上线!

星哥带你玩飞牛NAS-16:飞牛云NAS换桌面,fndesk图标管理神器上线!

  星哥带你玩飞牛 NAS-16:飞牛云 NAS 换桌面,fndesk 图标管理神器上线! 引言 哈...
如何免费使用强大的Nano Banana Pro?附赠邪修的用法

如何免费使用强大的Nano Banana Pro?附赠邪修的用法

如何免费使用强大的 Nano Banana Pro?附赠邪修的用法 前言 大家好,我是星哥,今天来介绍谷歌的 ...