首页 > 数据库 >VARCHAR与VARCHAR2在Oracle和达梦的表现差异

VARCHAR与VARCHAR2在Oracle和达梦的表现差异

时间:2024-04-16 10:14:01浏览次数:18  
标签:字符 VARCHAR -- 字符集 CHAR LENGTH VARCHAR2 Oracle varchar

达梦数据库与Oracle数据库在VARCHAR上的异同

在Oracle中

不同:

varchar:varchar存放可变长度的字符串,最大长度是2000,对于空串,varchar仍按空串处理。

varchar2:也是存放可变长度的字符串,最大长度是4000。VARCHAR2把空串等同于null处理。

相同:

根据编码不同,可容纳汉字不同:

具体要看字符集情况。比如GBK,汉字就会占两个字节,英文1个;如果是UTF-8,汉字一般占3个字节,英文还是1个

-- 比如表设计时 s_name 类型为varchar2(10),那最大容纳汉字只能是3个,多了会报错,比如输入“测试最大长度”时:
-- ORA-12899: 列 "FIPT_DEV"."TEST"."S_NAME" 的值太大 (实际值: 18, 最大值: 10)
-- 输入非汉字字符时也同理:数字和英文字符都是占一个长度,即默认varchar2(10)是varchar(10 byte),10个字节长度
-- 输入“测试abcdefg3” 时:
-- 报错:ORA-12899: 列 "FIPT_DEV"."TEST"."S_NAME" 的值太大 (实际值: 14, 最大值: 10)

-- 设计时字符与字节认知区别:
-- 占用字符数
select length('测试占用字符2') from dual;
-- 返回7
-- 占用字节数 (即varchar2 对应)
select lengthb('测试占用字节数2') from dual;
-- 返回22
-- ps:这里是utf8 ,所以一个汉字占3 字节

达梦8中

达梦8的语法基本是按照Oracle来的

所以,这里不比较varchar和varchar2,只以varchar为例区分字符集和初始化参数LENGTH_IN_CHAR不同对应的四种情况。

LENGTH_IN_CHAR=0表示不启用,为1则表示启用以字符为单位,将存储长度值按照理论字符长度进行放大,但最大存储长度不能超过8188个字节,放大规则(UTF8可乘以4,GBK可乘以2)

如下:

-- 1.查看字符集
select unicode from dual;
-- 这里我的字符集为 UTF-8

-- 2.查看初始化参数 LENGTH_IN_CHAR
select * from SYS.V$PARAMPTER where name like '%LENGTH_IN_CHAR%';
-- 这里我的是 LENGTH_IN_CHAR的value=1

-- UTF8且LENGTH_IN_CHAR=1则varchar(5)的列可以容纳20(5*4=20)个数字或字符的字符串,
-- 如果是中文,因为UTF-8字符集下中文与字母占用比例为3:1,也就是(5*4)/3 = 6个汉字
-- UTF8且LENGTH_IN_CHAR=0则varchar(5)的列可以容纳5个数字或字符的字符串,
-- 如果是中文,因为UTF-8字符集下中文与字母占用比例为3:1,也就是5/3 = 1个汉字

-- GBK且LENGTH_IN_CHAR=1则varchar(5)的列可以容纳5*2=10个数字或字符的字符串,
-- 如果是中文,因为GBK字符集下中文与字母占用比例为2:1,也就是(5*2)/2 = 5个汉字
-- GBK且LENGTH_IN_CHAR=0则varchar(5)的列可以容纳5个数字或字符的字符串,
-- 如果是中文,因为GBK字符集下中文与字母占用比例为2:1,也就是5/2 = 2个汉字

标签:字符,VARCHAR,--,字符集,CHAR,LENGTH,VARCHAR2,Oracle,varchar
From: https://www.cnblogs.com/dabuliu/p/18137514

相关文章

  • VMware 和 Oracle VM VirtualBox 网络互通(kali 与 vulnhub靶机 互通)
    由于有些从vulnhub下载的虚拟机只能用VirtualBox打开,而kali又在VMware上,两台虚拟机属于不同网段,即便同一网段也会存在无法上网的问题。在此记录一下解决方法首先查看kali(VMWare)与靶机(OracleVMVirtualBox)的IPkaliIP:192.168.198.128/24靶机IP:192.168.56.103/24(靶......
  • 2、Oracle Select语句
    最近项目要用到Oracle,奈何之前没有使用过,所以在B站上面找了一个学习视频,用于记录学习过程以及自己的思考。视频链接:【尚硅谷】Oracle数据库全套教程,oracle从安装到实战应用如果有侵权,请联系删除,谢谢。1、SQL基础介绍SQL的全程是:structurequerylanguage。SQL语句分为以......
  • Oracle数据表如何保留一条重复数据
    1使用rowid使用rowid,rowid是Oracle中每一行的唯一标识符,可以使用以下语句来删除重复数据,保留一条:deletefromyour_tablewhererowidnotin(selectmin(rowid)fromyour_tablegroupbyduplicate_columns);--其中,your_table是表名,duplicate_columns是用于判断......
  • Oracle中产生各种随机数的方法
    使用dbms_random包中的函数生成随机数--生成一个0~1之间的随机小数selectdbms_random.valueasrandom_numberfromdual;--生成一个0到100之间的整数随机数selectfloor(dbms_random.value(0,101))asrandom_numberfromdual;--生成一个由10个字符组成的随机字符串,字......
  • oracle 解锁和密码重置
    通过登录服务器的命令行工具首先,管理员需要登录服务器的命令行工具,执行以下命令:sqlplus/nolog这将启动SQL*Plus工具,即可以通过该工具连接Oracle数据库。在SQL*Plus中,管理员应该输入以下命令:connect/assysdba进行用户解锁,执行以下命令:ALTERUSERuser_nameACC......
  • mybatis怎么实现insert into多个数据-oracle数据库
    第一种<insertid="insertBatch"> INSERTALL <foreachcollection="list"item="user"separator=""close="SELECT*FROMdual"index="index"> INTOLY_TEST(id,name,age)VALUES(#{user......
  • Oracle 分页的SQL语句优化
    ORACLE的分页SQL,基本上在绝大部分的业务系统上都有这种SQL。处理这种SQL,基本上要用到两点:(1).利用rownum的COUNTSTOPKEY特性.(2).利用索引的排序特性,消除sortorderby. 今天,同事发给我两个SQL。执行计划大概如下:  第1个SQL的执行计划,没有出现COUNTSTOPKEY,结合......
  • oracle 更改schema名
    1、用sysdba账号登入数据库,然后查询到要更改的用户信息:SELECTuser#,nameFROMuser$;2、更改用户名并提交: updateuser$setname='demokygs'whereuser#=111;COMMIT;3、强制刷新:ALTERSYSTEMCHECKPOINT;ALTERSYSTEMFLUSHSHARED_POOL;4、更新用户的密码:......
  • 从Oracle迁移到PostgreSQL的十大理由
    从Oracle迁移到PostgreSQL的十大理由PostgreSQLChina官方微信:开源软件联盟PostgreSQL分会 19人赞同了该文章作者:保罗·纳穆格PaulNamuag能够担任各种职务,受益于在过去的18年中有机会使用各种技术。他从2005年开始担任图形艺术家和MS.Net开发人员......
  • Oracle VM VirtualBox网络设置
    首先说明vmWare功能比VirtualBox强大,网卡设置也更加灵活,并且可以一种模式搞定你所有的需求,如果能用vmWare那就就优先用vmWareVirtualBox的网络设置和vmWare的网络设置不同vmWare的NAT模式和hostOnly模式都会在宿主机中映射一个虚拟网卡,通过这个网卡宿主机可以通过IP地址链......