中文在oracle里到底占几个字符位

本文探讨了在Oracle数据库中不同字段类型如何影响字符及字节的计数方式,并通过实例展示了如何使用Length和Lengthb函数来计算字符串的字符数和字节数。

问题描述

或许你会说一个中文字符占2个字节,这是一定的?如何计算一个字符串的字节数?

 解决方案

在oracle中一个字符特别是中文占几个字节是不同的。

比如我创立一个表create table test_ly(a varchar2(4),b nvarchar2(4))

你说a列能插入两个汉字吗?

错!最多能插入一个汉字加一个字母(或数字)。

这是为什么?因为一个汉字在a字段中占了3个字节,其他字符(比如数字或者字母或者英文标点符号)占1个字节,

你说b列最多能插入多少个汉字,2个?

错!b列最多能插入4个汉字,b列的一个汉字或者其他字符(比如数字或者字母或者英文标点符号)占2个字节。

 

由此可见,N开头的字段类型(比如NCHAR,NVARCHAR2)中,任何一个字符(包括一个汉字)占2个字节,统一的。

不以N开头的字段类型(比如CHAR,VARCHAR2)中,unicode字符(比如汉字)占3个字节,其他字符占1个字节。

 

如何求一个字符串占用的字符数和字节数?

Length 函数求得是占用字符数,lengthb或者vsize函数求得是占用字节数。

你说 中华12 这个字符串占用了多少字符,字节?看sql返回值便清楚了。

select length('中华12') from dual  --返回4,也就是占用4个字符

select lengthb('中华12') from dual  --返回8,也就是占用8个字节,其中中华儿子各占3个字节,而12两个字符各占一个字节

select lengthb(N'中华1') from dual  --返回6,这是将字符串转换成为unicode字符串后,每个字符占用2个字节,3个就是6个字节

select length(N'中华1') from dual  --返回3,因为只有3个字符嘛。

 

字符串类型字段默认的长度是以字节为单位的,具体取决于参数nls_length_semantics 的值(使用show parameters可以看到这个参数的值),默认是BYTE,也就是以字节为单位的,如果是CHAR则是以字符为单位的。表的某列可以使用字符为单位吗?当然可以,比如这样创建即可:create table test_ly(a varchar2(4 char)) 这样a列就最多能保存4个字符,而不是4个字节了。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/24492954/viewspace-765139/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/24492954/viewspace-765139/

<think>好的,我需要回答用户关于MySQL和Oracle数据库中varchar类型存储中文字符用字符数的问题。首先,我得确认不同数据库的字符编码对存储的影响。对于MySQL,varchar的长度取决于字符集。比如,使用utf8mb4编码时,每个中文字符4个字节,而varchar(N)中的N代表字符数,所以可以存储N个中文字符,但总字节数不能超过65,535。需要说明不同版本的情况,特别是MySQL5.0.3前后的变化。然后是Oracle,varchar2同样由字符集决定。如果使用AL32UTF8(UTF-8),一个中文字符通常3个字节,而varchar2(N CHAR)允许存储N个字符,但总字节数不超过4000。这要区分CHAR和BYTE的区别,用户可能需要知道如何指定以字符为单位还是字节为单位。还要注意不同数据库的默认设置,比如MySQL的utf8mb4和Oracle的AL32UTF8,以及这些编码对存储的具体影响。需要提醒用户实际使用时的注意事项,比如字段长度计算和索引限制。最后,生成相关问题,确保覆盖常见的疑问,比如编码修改、存储计算、性能影响等。</think>在MySQL和Oracle数据库中,$varchar$类型存储中文字符用的字节数与字符编码直接相关,具体分析如下: ### 一、MySQL中的情况 1. **字符编码决定存储** - 使用$utf8mb4$编码时,每个中文字符用$4$字节 - 使用$gbk$编码时,每个中文字符用$2$字节 - $varchar(N)$中的$N$表示字符数,因此可存储$N$个中文字符[^1] 2. **字段长度限制** $$最大字节数=65535 \div 字符最大字节长度$$ 例如$utf8mb4$编码下,理论最大字符数为$\lfloor 65535/4 \rfloor=16383$字符 3. **版本差异** MySQL 5.0.3之前$varchar$最大支持$255$字节,之后版本支持到$65535$字节[^2] ### 二、Oracle中的情况 1. **字符编码规范** - 使用$AL32UTF8$(UTF-8)编码时,每个中文字符通常用$3$字节 - 使用$ZHS16GBK$编码时,每个中文字符用$2$字节 2. **字段定义方式** - $varchar2(N\ CHAR)$:按字符数定义,可存储$N$个中文字符 - $varchar2(N\ BYTE)$:按字节数定义,存储数量需根据编码计算 例如UTF-8编码下,$varchar2(4000\ BYTE)$约可存储$\lfloor 4000/3 \rfloor=1333$个中文字符 3. **版本约束** Oracle 12c及以上版本支持$varchar2(32767\ BYTE)$,但需开启扩展数据类型[^3] ### 三、关键对比表 | 数据库 | 编码示例 | 中文字符字节数 | 字段定义方式 | 最大字符数限制 | |---------|-------------|----------------|-----------------------|-----------------| | MySQL | utf8mb4 | 4 | varchar(N) | 16383 | | Oracle | AL32UTF8 | 3 | varchar2(N CHAR) | 4000/32767 | ### 四、实际应用建议 1. **创建字段时显式指定字符集** ```sql -- MySQL示例 CREATE TABLE t1 (name VARCHAR(100) CHARACTER SET utf8mb4) -- Oracle示例 CREATE TABLE t2 (name VARCHAR2(100 CHAR)) ``` 2. **注意行存储限制**,单行总长度不能超过数据库页大小 3. **索引字段长度**需考虑前缀索引限制(如MySQL的$3072$字节限制)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值