Oracle数据库的varchar2(2)存储一个汉字时提示插入汉字过长问题

本文探讨了在Oracle实验课中遇到的VARCHAR2数据类型存储汉字过长的问题,通过实验发现一个汉字占用三个字节而非两个。解释了字符集与汉字存储的关系,并提供了修改默认字符集的方法以实现VARCHAR2(2)存储一个汉字的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

昨天在oracle实验课上出现了如题所示的问题:varchar2(2)在存储一个汉字时,提示插入汉字过长,要把它改成3才能存储1个汉字。于是百度google之。

先做以下实验:

建一个简单的表var,只有一列name,数据类型为varchar2(6),并向表中插入一条数据。

create table var (name varchar2(6));
insert into var values('测试');

查询插入的数据,并且同时查看name列的字符长度和字节长度。结果如下图:

select u.name, length(u.name), lengthb(u.name)
from var u;

从结果中可以看出,一个汉字占了三个字节,而不是两个,这跟字符集有关。

查看字符集的代码和结果如下:

select userenv('language') from dual;

结果显示,本机Oracle的字符集是UTF-8,32位,而不是GBK的16位。UTF-8的每个字符占3个字节(bytes),可以通过修改默认字符集来实现varchar2(2)存储一个汉字。方法如下:

SHUTDOWN IMMEDIATE;  
STARTUP MOUNT; 
ALTER SYSTEM ENABLE RESTRICTED SESSION; 
 ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0; 
ALTER DATABASE OPEN; 
ALTER DATABASE CHARACTER SET AL32UTF8/ZHS16GBK;
SHUTDOWN IMMEDIATE;

STARTUP;

主要参考资料:http://dev.tot.name/db/html/20090322/20090322131055.htm
附:

ORACLE nvarchar2和varchar2的区别

1、NVARCHAR2中存储中文字时,一个中文字当一个字符来处理
NVARCHAR2(10)是可以存进去10个汉字的,如果用来存英文也只能存10个字符。
2、而VARCHAR2中一个中文字当两个字符来处理
VARCHAR2(10)的话,则只能存进5个汉字,英文则可以存10个

Oracle中nvarchar2和varchar2的共同点:
不定长存储,当存储信息长度小于指定的长度,那么就已实际存入的长度为准这一点不像varchar这种定长存储那样浪费空间,比如varchar 指定是10个字符,那么存入5个字符的时候,他会自动填充空格来补齐以达到指定的长度



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值