Oracle中一个汉字占几个字节?

某天,在向一个字段类型为CHAR(6)的表中插入数据’大沽口’时报错,提示’too large for column(actual: 9 ,maximum: 6)’。

我这眉头一皱,发现了事情没有这么简单。怎么办?百度!下面直接放结论:

  • N开头的字段类型(比如NCHAR,NVARCHAR2)中,任何一个字符(包括一个汉字)占2个字节,统一的。
  • 不以N开头的字段类型(比如CHAR,VARCHAR2)中,部分unicode字符(比如汉字)占3个字节,其它字符占1个字节

实践一下

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

select length(‘测试1’) from dual --返回3,占用3个字符

select lengthb(‘测试1’) from dual --返回7,占用7个字节,其中汉字占3个字节,数字占一个字节

select length(N’测试1’) from dual --返回3,占用3个字符

select lengthb(N’测试1’) from dual --返回6,这是将字符串转换成为Unicode字符串后,每个字符占用2个字节

测试完之后,我不禁陷入了沉思:数据库字符集是UTF-8,一个中文占三个字节,当把中文转换为Unicode字符之后却只占2个字符。这是为啥呢?接着收集资料。

为何Unicode中文字符占取2个字节,而 UTF-8却占3个字节?

发明 UTF-8的初衷是为了修正Unicode中任何字符至少占用2个字节的弊端。虽然UTF-8英文字符占空间减少了(由Unicode中的16位动态缩减为与ASCⅡ一致的8位),但在中文字符这部分增为3字节=24位,减少的空间一下子又没了。

Unicode符号范围 UTF-8编码方式 说明
(十六进制) (二进制) #Unicode部分为16进制编码, UTF-8编码为2进制
0000 0000-0000 007F 0xxxxxxx #UTF-8规定,若1字符=1字节,首位须为‘0’
0000 0080-0000 07FF 110xxxxx 10xxxxxx #UTF-8规定,若1字符=2字节,高位字节前3位为‘110’,低位前2位为‘10’
0000 0800-0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx #UTF-8规定,若1字符=3字节,高位字节前3位为‘110’,后面低位前2位一律为‘10’。(占4,5字节字符规则以此类推)

由于UTF-8规则天然占用字节前几位,若与Unicode同样用2字节16位表示一个中文字符,则utf-8除去规则占用,只剩余16-5=11位,无法存储中文,只能再增加一个字节,1字符=3字节,除去规则占用,还剩余8x3-8=16位,恰好符合16位=1中文字符这一Unicode规则

举个例子:

已知“严”的Unicode是4E25(100111000100101),根据上表,可以发现4E25处在第三行的范围内(0000 0800-0000 FFFF),因此“严”的UTF-8编码需要三个字节,即格式是“1110xxxx 10xxxxxx 10xxxxxx”。然后,从“严”的最后一个二进制位开始,依次从后向前填入格式中的x,多出的位补0。这样就得到了,“严”的UTF-8编码是“11100100 10111000 10100101”,这是保存在计算机中的实际数据,转换成十六进制就是E4B8A5

[参考地址][https://www.zhihu.com/question/23374078/answer/134244691]

补充

UTF-8英文1字节中文3字节,在编码效率和编码安全性之间做了平衡,适合网络传输,是理想的中文编码方式。UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度
GBK英文1字节(半角1字节,全角2字节),中文2字节,GBK的范围比GB2312广,GBK兼容GB2312。
Unicode编码则是采用双字节16位来进行编号,可编65536字符

Oracle中一个汉字占几个字节相关推荐

  1. oracle和mysql存储汉字_mysql和oracle的一个汉字占几个字节

    以前一直使用oracle11g,一个汉字占3个字节,所以在操作mysql时也一直这样分配长度. 今天测试了下发现不对了 可以看到第一个的长度确实是15,但是第二个为什么是5? 在网上找到资料:char ...

  2. utf-8 中的一个汉字占几个字节

    utf-8 中的一个汉字占几个字节 占 2 个字节的:〇 占 3 个字节的:基本等同于 GBK,含 21000 多个汉字 占 4 个字节的:中日韩超大字符集里面的汉字,有 5 万多个 1 个 utf8 ...

  3. mysql汉字占几个字符_mysql和oracle的一个汉字占几个字符

    以前一直使用oracle11g,一个汉字占3个字节,所以在操作mysql时也一直这样分配长度. 今天测试了下发现不对了 可以看到第一个的长度确实是15,但是第二个为什么是5? 在网上找到资料:char ...

  4. python中一个汉字点3个字节? utf-8

    今天发现了一个汉字占了3个字节,一开始以为是两个呢,字符串切片时总出现乱码,后来才发现一个中文占3个字节.这才解决了乱码问题 原来  1. utf-8 编码中,一个汉字占三个字节.英文字母是一个占用一 ...

  5. mysql 中 一个汉字吗_MySQL 中一个汉字占多少存储?

    MySQL 中一个汉字占多少存储? 1. 一个汉字占多少长度与编码有关: UTF8: 一个汉字 = 3 个字节 GBK: 一个汉字 = 2 个字节 2.varchar(n)能存储几个汉字? varch ...

  6. utf-8中一个汉字是3个字节,你知道吗?

    问题导入: 今天学习了mysql中的函数,length(字符串),计算字符串长度函数,返回字符串的字节长度. select length('abc'); 查询的结果是3. select length( ...

  7. 一个汉字占几个字节的问题

    一个汉字占几个字节的问题 大家都说一个汉字占两个字节(byte) 但是为什么运行程序会得到如下结果 String name="宋"; int a=name.getBytes(&qu ...

  8. java 汉字 字节_java中的汉字占几个字节

    java中的汉字占几个字节 发布时间:2020-06-25 20:02:07 来源:亿速云 阅读:217 作者:Leah 今天就跟大家聊聊有关java中的汉字占几个字节,可能很多人都不太了解,为了让大 ...

  9. java一个中文几个字节_java一个汉字占几个字节;一个字符占几个字节?redis一个汉字占几个字节;一个字符占几个字节?...

    脱离字符集编码 谈这个问题没什么实际意义 我不知道你讲的Java 中汉字是几个字节具体是什么意思 Java 中 Character 采用的是 utf-16 编码,那么就是两个字节(0----65535 ...

最新文章

  1. 空间谱专题09:阵列信号建模方法
  2. 依赖注入框架Autofac学习笔记
  3. 以智能数据架构,挖掘增长金矿 1
  4. 2020 8月 每日花语
  5. 【数据结构与算法】之深入解析“分发糖果”的求解思路与算法示例
  6. Basler相机SDK相关问题收集与知识汇总
  7. javafx树视图加选框_JavaFX缺少的功能调查:表视图
  8. FastJson稍微使用不当就会导致StackOverflow
  9. 判断字段是否与枚举相同_Scala基础学习九之枚举和Trait了解
  10. 动手学深度学习(PyTorch实现)(九)--VGGNet模型
  11. Leetcode每日一题:197.rising-temperature(上升的温度)
  12. 判断 Map 中是否包含指定的 key 和 value
  13. BXP 3.11样机安装详细说明(转)
  14. wk一sm5时间温度控制器_吓人!用“御寒神器”取暖,竟上了手术台……注意!温度不高也会烫伤...
  15. Centos7做回收站功能,防止误删除
  16. 过 DNF TP 驱动保护(二)
  17. H盘显示数据错误循环冗余检查要怎样办啊
  18. 【源码阅读 | 04】update-notifier 检查包更新
  19. 浏览器原理-持续汇总
  20. 13.56Mhz下50欧姆阻抗匹配简易教程

热门文章

  1. PTA:7-9 分钟秒钟的时间相减
  2. java版我的世界MITE怎么下_我的世界mite作弊图文教程
  3. JavaScript断言
  4. 看两种截然不同的设计理念:分布式文件系统支持大和小文件的思考
  5. SOA 架构中的ESB是更好的应用于异构系统集成整合还是用于统一服务调用/基础服务实施...
  6. 【我们为什么用高斯机制?】差分隐私代码实现系列(七)
  7. Qml SwipeView禁用滑动动画
  8. 噪音恐惧症_比恐惧强:公开的心理健康
  9. linux7操作,Linux centos7 基本操作 七
  10. 2022年舞台造雪机市场前景分析及研究报告